Спустя 1 час, 8 минут, 28 секунд (10.04.2009 - 12:15) fever написал(а):
1) какая тут закономерность между строками (чтобы расположить их в нужном порядке)? Я так подозреваю, что это что-то вроде глав и под-глав в содержании? Типа 1, 1.1.1, 1.1.2, 1.2, 1.2.1, 2 и т.д.?
2) сколько таких "подглав" может быть в одном элементе? может ли быть, скажем, 1/2/2/4/2 ? Есть какие-то ограничения кроме как на кол-во символов в varchar(10)?
2) сколько таких "подглав" может быть в одном элементе? может ли быть, скажем, 1/2/2/4/2 ? Есть какие-то ограничения кроме как на кол-во символов в varchar(10)?
Спустя 9 минут, 23 секунды (10.04.2009 - 12:24) sergeiss написал(а):
В PostgreSQL я попробовал - получается Только обязательное условие, что поле - либо простое число (в символьном представлении), либо число со знаком '/' и не важно, что там далее. Точнее, можно сделать даже набор разных знаков. Код немного усложнится, но принцип останется.
Идея такая: из этого поля надо создать дополнительное поле целого типа. Если в поле есть знак '/', то тогда выбираем все знаки до искомого, и преобразуем к целому типу.
Если в поле нету этого специального знака, то тогда просто преобразуем к целому типу.
Далее даем полю своё имя, и сортируем по нему.
Все используемые возможности и функции (case, strpos, substr) являются стандартными (вроде бы).
Идея такая: из этого поля надо создать дополнительное поле целого типа. Если в поле есть знак '/', то тогда выбираем все знаки до искомого, и преобразуем к целому типу.
Если в поле нету этого специального знака, то тогда просто преобразуем к целому типу.
Далее даем полю своё имя, и сортируем по нему.
Все используемые возможности и функции (case, strpos, substr) являются стандартными (вроде бы).
SQL |
select *, case when strpos(key_field,'/')>0 then cast( substr( key_field, 1, strpos(key_field, '/')-1) as integer ) else cast (key_field as integer) end as ind from table1 order by ind |
Вот и всё, собственно.
PS. Ежели надо добавить дополнительно сортировку по той части, которая идет после знака '/', то тогда надо сделать еще одно дополнительное поле, и сортировать по ним обоим одновременно. Надо только будет брать ту часть, которая идет после спецзнака, либо записывать ноль в дополнительное поле.
Спустя 50 минут, 45 секунд (10.04.2009 - 13:15) Yulk написал(а):
Спасибо за идею... А в MySQL разве такое сработает? Что-то у меня не получается...
Спустя 14 минут, 2 секунды (10.04.2009 - 13:29) sergeiss написал(а):
Цитата (Yulk @ 10.04.2009 - 13:15) |
Спасибо за идею... А в MySQL разве такое сработает? Что-то у меня не получается... |
Должно сработать. Посмотри повнимательнее описание синтаксиса для CAST и CASE.
Не исключено, что там есть какие-то отличия, но в принципе всё должно быть также.
И еще - выложи сюда свой запрос, который ты формируешь. Не исключено, что там где-то сидит ошибка. Посмотрим вместе.
Спустя 1 час, 24 минуты, 5 секунд (10.04.2009 - 14:53) Yulk написал(а):
fever
нет, тут нет такой сложной вложенности, это номера писем и могут быть номера с дробью - дополнения к самим письмам... не более
sergeiss
попробую еще сама покопаться, если уж не получится разобраться - попробуем вместе
нет, тут нет такой сложной вложенности, это номера писем и могут быть номера с дробью - дополнения к самим письмам... не более
sergeiss
попробую еще сама покопаться, если уж не получится разобраться - попробуем вместе
Спустя 8 минут, 47 секунд (10.04.2009 - 15:02) sergeiss написал(а):
Цитата (Yulk @ 10.04.2009 - 14:53) |
sergeiss попробую еще сама покопаться, если уж не получится разобраться - попробуем вместе |
ОК, такой подход очень даже правильный
Спустя 1 час, 8 минут, 24 секунды (10.04.2009 - 16:10) Yulk написал(а):
Сделала немного по-другому, с помощью SUBSTRING_INDEX, вроде все правильно сортирует кроме одного момента : сначала ставятся номера с дробями, потом уже без дроби:
122
123/1
123/2
123
124
...
122
123/1
123/2
123
124
...
SQL |
SELECT * FROM mail ORDER BY CAST(SUBSTRING_INDEX(nomer_in,'/',1) AS UNSIGNED INTEGER), CAST(SUBSTRING_INDEX(nomer_in,'/',-1) AS UNSIGNED INTEGER) |
Спустя 4 минуты, 51 секунда (10.04.2009 - 16:15) sergeiss написал(а):
Если это то, что тебе надо - то тогда "флаг в руки"
Спустя 18 минут, 43 секунды (10.04.2009 - 16:34) Yulk написал(а):
нет, мне надо чтоб было так:
123
123/1
123/2
Как бы теперь еще этот момент поправить?
просто с CASE что-то я не очень разобралась, не получается...
123
123/1
123/2
Как бы теперь еще этот момент поправить?
просто с CASE что-то я не очень разобралась, не получается...
Спустя 1 минута, 26 секунд (10.04.2009 - 16:35) vasa_c написал(а):
А просто в алфавитном порядке это не то?
Спустя 8 минут, 15 секунд (10.04.2009 - 16:43) FatCat написал(а):
Цитата (Yulk @ 10.04.2009 - 16:34) |
нет, мне надо чтоб было так: 123 123/1 123/2 |
PHP |
$key = intval((str_replace("/",".",$key))*10); |
Спустя 22 минуты, 38 секунд (10.04.2009 - 17:06) Yulk написал(а):
vasa_c
числа в алфавитном порядке?
FatCat
Тогда что за запрос получится? Так:
числа в алфавитном порядке?
FatCat
Тогда что за запрос получится? Так:
SQL |
SELECT * FROM mail ORDER BY intval((str_replace("/",".",nomer_in))*10) |
не работает, выдает ошибку...
Спустя 1 час, 2 минуты, 4 секунды (10.04.2009 - 18:08) FatCat написал(а):
Не, это уже в пхп сортируется.
PHP |
$temp_arr = Array(); |
Спустя 1 час, 33 минуты, 5 секунд (10.04.2009 - 19:41) vasa_c написал(а):
Цитата |
vasa_c числа в алфавитном порядке? smile.gif |
VARCHAR(10) не числа
Спустя 3 часа, 5 минут, 45 секунд (10.04.2009 - 22:47) sergeiss написал(а):
Я бы все-таки предложил разобраться с CASE, чтобы его понять и чтобы он заработал так, как надо. Может быть, у тебя была проблема не с самим CASE, а с чем-то другим?
Попробуй выполнить простой запрос типа
Попробуй выполнить простой запрос типа
SQL |
select *, case when nomer_in='122' then 122 else 0 end as new_nomer_in from mail |
Если этот запрос даст результат, то можно будет дальше разбираться.
По той методике, что я ранее предложил в этой теме, можно будет и вторую часть числа (после знака '/') вытащить элементарно, и в одном запросе всё сразу отсортировать правильно. Чтобы потом в ПХП только взять уже готовый результат.
Спустя 2 дня, 11 часов, 59 минут, 31 секунда (13.04.2009 - 10:46) Yulk написал(а):
Всем большое спасибо
С сортировкой разобралась маленько, но к той же таблице еще одна задачка - надо выбрать наибольший и наименьший номер в каждых 100 записях, причем сортировка в таблице обратная ( нужно для постраничной навигации, чтобы рядом с номером страницы выводились с какого по какой номер письма на ней)
запрос делаю такой, но он не работает, то есть работает без учета LIMIT:
С сортировкой разобралась маленько, но к той же таблице еще одна задачка - надо выбрать наибольший и наименьший номер в каждых 100 записях, причем сортировка в таблице обратная ( нужно для постраничной навигации, чтобы рядом с номером страницы выводились с какого по какой номер письма на ней)
запрос делаю такой, но он не работает, то есть работает без учета LIMIT:
SQL |
$query = "SELECT max(CAST(SUBSTRING_INDEX(nomer_in,'/',1) AS UNSIGNED INTEGER)) AS nomer_max, min(CAST(SUBSTRING_INDEX(nomer_in,'/',1) AS UNSIGNED INTEGER)) AS nomer_min FROM mail LIMIT $n, $p"; |
Спустя 7 минут, 3 секунды (13.04.2009 - 10:53) Yulk написал(а):
sergeiss
не увидела ваше сообщение когда писала предыдущее
Насколько понимаю, должен быть везде 0 кроме 122 номера...так получилось...
понедельник, тормоз в голове ужасный
не увидела ваше сообщение когда писала предыдущее
Насколько понимаю, должен быть везде 0 кроме 122 номера...так получилось...
понедельник, тормоз в голове ужасный
Спустя 19 минут, 2 секунды (13.04.2009 - 11:12) sergeiss написал(а):
Здесь получается, что у тебя в запросе выбирается только одна строка, содержащая максимальное и минимальное значения.
Можно сделать сначала запрос на выборку 100 нужных значений, и тут же использовать этот запрос для выборки максимального и минимального значения.
Примерно так:
Можно сделать сначала запрос на выборку 100 нужных значений, и тут же использовать этот запрос для выборки максимального и минимального значения.
Примерно так:
SQL |
select max( nomer ), min( nomer) from ( select ......... limit ..... ) nomers |
Но только тогда получится, что сама выборка нужных 100 значений будет делаться дважды: для нахождения максимума-минимума и просто для выборки этих значений.
Поэтому я бы лучше нашел максимум и минимум уже в ПХП, на основании 100 выбранных данных.
PS. Я не понял, где получился ноль В том запросе? Тогда вопрос: а есть ли а таблице значения с номером '122'? Я подразумевал, исходя из предыдущих сообщений, что этот номер там есть.
Спустя 16 минут, 55 секунд (13.04.2009 - 11:29) Yulk написал(а):
Есть 122 номер, просто он на 2 странице, не сразу сообразила...
Что-то до меня сегодня все с 3 раза доходит...
А max и min в php с учетом особенностей номера...
Давайте сначала тогда с запросом с CASE разберемся
Что-то до меня сегодня все с 3 раза доходит...
А max и min в php с учетом особенностей номера...
Давайте сначала тогда с запросом с CASE разберемся
Спустя 5 минут, 12 секунд (13.04.2009 - 11:34) sergeiss написал(а):
ОК, продолжаем насчет CASE.
Цитата (Yulk @ 13.04.2009 - 10:53) |
Насколько понимаю, должен быть везде 0 кроме 122 номера...так получилось... понедельник, тормоз в голове ужасный |
У меня только просьба не редактировать предыдущие сообщения, а писать новые в этой же теме - иначе можно просто не заметить, что что-то поменялось
Получаем, что CASE отработал исправно.
Тогда попробуй такой запрос (это мой же запрос с 1-й страницы темы, но только изменены названия используемых функций):
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then cast( substring( nomer_in, 1, substring_index(nomer_in, '/',1)-1) as integer ) else cast (nomer_in as integer) end as ind from mail order by ind |
Мне так кажется, что он должен быть успешным...
Спустя 7 минут, 2 секунды (13.04.2009 - 11:42) Yulk написал(а):
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Спустя 5 минут, 16 секунд (13.04.2009 - 11:47) sergeiss написал(а):
Цитата (Yulk @ 13.04.2009 - 11:42) |
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource |
После вызова mysql_query(....) напиши кое-что:
PHP |
...mysql_query(...) or die( mysql_error() ); |
И ответ - давай сюда.
Спустя 47 минут (13.04.2009 - 12:34) Yulk написал(а):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'integer ) else cast (nomer_in as integer) end as ind from mail_in order by i' at line 3
Спустя 12 минут, 38 секунд (13.04.2009 - 12:46) sergeiss написал(а):
Посмотрел хэлп по мюзиклу, помедитировал...
Попробуй заменить в запросе 'integer' на 'unsigned integer' (в 2-х местах). Судя по хэлпу, просто 'integer' тут указывать нельзя, в отличие от Постгре.
Попробуй заменить в запросе 'integer' на 'unsigned integer' (в 2-х местах). Судя по хэлпу, просто 'integer' тут указывать нельзя, в отличие от Постгре.
Спустя 7 минут, 16 секунд (13.04.2009 - 12:54) Yulk написал(а):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unsigned integer) end as ind from mail_in order by ind' at line 4
Спустя 13 минут, 58 секунд (13.04.2009 - 13:08) sergeiss написал(а):
Если честно... То я не могу точно сказать, где ошибка. Потому как MySQL у меня нету.
Давай тогда по частям пробовать, отлаживать запрос, искать причину ошибки...
Давай тогда по частям пробовать, отлаживать запрос, искать причину ошибки...
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then 0 else cast (nomer_in as unsigned integer) end as ind from mail order by ind |
SQL |
select *, substring_index(nomer_in, '/',1) as ind from mail order by ind |
Спустя 3 часа, 53 минуты, 33 секунды (13.04.2009 - 17:01) Yulk написал(а):
Второй запрос выполнился, на первый та же ошибка : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unsigned integer) end as ind from mail_in order by ind' at line 5
Спустя 1 час, 19 минут, 54 секунды (13.04.2009 - 18:21) Joker написал(а):
я попробовал у меня получилось))
Таблица:
Таблица:
SQL |
-- CREATE TABLE `test` ( `id` int(10) NOT NULL auto_increment, `t` varchar(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; -- -- Дамп данных таблицы `test` -- INSERT INTO `test` VALUES (1, '123'); INSERT INTO `test` VALUES (2, '123/1'); INSERT INTO `test` VALUES (3, '123/2'); INSERT INTO `test` VALUES (4, '123/9'); INSERT INTO `test` VALUES (5, '122/8'); |
Запрос
SQL |
SELECT * FROM `test` ORDER BY `t` |
И отсортировалось как нужно.
Если так не помогает выложи табличку, чтоб можно было поэксперементировать с запросами
Спустя 2 часа, 25 секунд (13.04.2009 - 20:22) sergeiss написал(а):
Если у тебя будут только "122" и "123" с вариациями, то проблем нету А ты попробуй внести величины "1", "10", "11", "3", "22", "123" и попробуй их отсортировать вот так вот, как ты сделал. Что получишь?
1, 10, 11, 123, 22, 3
А надо что?
1, 3, 10, 11, 22, 123
Да еще и надо учесть, что могут быть номера после слэша.
Так что тут нужно делать более сложную сортировку, о которой я говорил. Да и Yulk (Юля ?) не зря спрашивала.
1, 10, 11, 123, 22, 3
А надо что?
1, 3, 10, 11, 22, 123
Да еще и надо учесть, что могут быть номера после слэша.
Так что тут нужно делать более сложную сортировку, о которой я говорил. Да и Yulk (Юля ?) не зря спрашивала.
Спустя 11 часов, 33 минуты, 20 секунд (14.04.2009 - 07:55) Yulk написал(а):
sergeiss
вот такой запрос выполнился
вот такой запрос выполнился
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then 0 else 1 end as ind from mail order by ind |
значит ошибка где-то здесь
SQL |
cast (nomer_in as unsigned integer) |
но тут вроде тоже все правильно???
Спустя 5 минут, 6 секунд (14.04.2009 - 08:00) Yulk написал(а):
Ну конечно, все дело просто в лишнем пробеле после cast
Спустя 4 минуты, 17 секунд (14.04.2009 - 08:04) sergeiss написал(а):
Так я не понял - сейчас всё работает? Я имею ввиду мой запрос, в котором убран лишний пробел:
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then cast( substring( nomer_in, 1, substring_index(nomer_in, '/',1)-1) as integer ) else cast(nomer_in as integer) end as ind from mail order by ind |
Спустя 12 минут, 17 секунд (14.04.2009 - 08:17) Yulk написал(а):
Нет, сработал запрос
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then 0 else cast(nomer_in as unsigned integer) end as ind from mail order by ind |
, а в полном запросе опять ошибка
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then cast(substring(n' at line 2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then cast(substring(n' at line 2
Спустя 8 минут, 22 секунды (14.04.2009 - 08:25) sergeiss написал(а):
ОК. Получается, что мы разобрались, как работают CASE, substring_index, CAST (и что они вообще работают ). Остался только substring?
Попробуй этот запрос без КАСТа:
Попробуй этот запрос без КАСТа:
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then substring( nomer_in, 1, substring_index(nomer_in, '/',1)-1) else nomer_in end as ind from mail order by ind |
PS. Опять же - может тут пробелы лишние где??? Поэкспериментируй, плз!
Спустя 5 минут, 59 секунд (14.04.2009 - 08:31) Yulk написал(а):
Все то же самое:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then substring(nomer_' at line 2
А что вообще делает
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then substring(nomer_' at line 2
А что вообще делает
SQL |
substring(nomer_in, 1, substring_index(nomer_in, '/',1)-1) |
... не совсем поняла... почему 1?
Спустя 6 минут, 44 секунды (14.04.2009 - 08:38) sergeiss написал(а):
Цитата (Yulk @ 14.04.2009 - 08:31) | ||
Все то же самое: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then substring(nomer_' at line 2 А что вообще делает
... не совсем поняла... почему 1? |
Вот есть у тебя номер вида "1245/32"
substring_index(nomer_in, '/',1) находит положение первого (1) знака '/' и возвращает его. В данном случае вернет 5, а за вычетом единицы - 4.
substring выделяет часть строки, в данном случае
substring(nomer_in, 1, substring_index(nomer_in, '/',1)-1) должно выделить первые 4 знака из номера (4 начиная с первого), т.е. 1245.
После чего надо бы эту фигню преобразовать в целое число через CAST. Но это уже потом!
Попробуй убрать все пробелы внутри сабстринга:
SQL |
select *, case when substring_index( nomer_in,'/',1)>0 then substring(nomer_in,1,substring_index(nomer_in,'/',1)-1) else nomer_in end as ind from mail order by ind |
Спустя 6 минут, 38 секунд (14.04.2009 - 08:44) sergeiss написал(а):
Сорри... Я тут тормознул немного substring_index возвращает строку, а не положение этого знака!
Тогда запрос получается такой, вроде бы:
Тогда запрос получается такой, вроде бы:
SQL |
select *, case when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as integer ) else cast(nomer_in as integer) end as ind from mail order by ind |
Спустя 7 минут, 26 секунд (14.04.2009 - 08:52) Yulk написал(а):
Ага, сама только что начала искать в справочнике и то же самое заметила
Теперь все сработало, но в сортировке нечто странное:
145/1
145
145/2
Теперь все сработало, но в сортировке нечто странное:
145/1
145
145/2
Спустя 7 минут, 50 секунд (14.04.2009 - 09:00) sergeiss написал(а):
Цитата (Yulk @ 14.04.2009 - 08:52) |
Ага, сама только что начала искать в справочнике и то же самое заметила Теперь все сработало, но в сортировке нечто странное: 145/1 145 145/2 |
А про это я говорил еще в самом начале
В качестве самостоятельной работы предлагаю сделать второй индекс, по числу после '/', и сортировать по нему тоже.
Если слэша нету, то индекс сделай равным нулю.
Принцип тот же самый, что и для первого индекса. Даже функции те же самые Только с параметрами поиграться надо немного.
Спустя 3 минуты, 13 секунд (14.04.2009 - 09:03) sergeiss написал(а):
И еще. Лучше использовать в сравнении не "substring_index( nomer_in,'/',1) > 0", а "length( substring_index( nomer_in,'/',1)) > 0".
Спустя 20 минут, 54 секунды (14.04.2009 - 09:24) Yulk написал(а):
Это что ли надо еще один case делать? или можно как-то в одном?
Спустя 6 минут, 9 секунд (14.04.2009 - 09:30) kirik написал(а):
Если еще нужно
SQL |
SELECT * FROM `test_n` ORDER BY ABS(`t`) ASC |
или
SQL |
SELECT * FROM `test_n` ORDER BY `t` + 0 ASC |
отсортируют так:
3
10
11
100
120
128
128/3
128/2
128/1
1000
1050
1111
Таблица используется Joker'а.
Спустя 4 минуты, 42 секунды (14.04.2009 - 09:34) sergeiss написал(а):
Еще один КЕЙС надо. Структура его очень похожая будет, но другой нужен.
kirik - может мюзикл так и отсортирует, кто его знает Но, опять же, у тебя не совсем правильный порядок сортировки получился.
kirik - может мюзикл так и отсортирует, кто его знает Но, опять же, у тебя не совсем правильный порядок сортировки получился.
Спустя 10 минут, 56 секунд (14.04.2009 - 09:45) Yulk написал(а):
Каждый по отдельности CASE работает, вместе нет...что я еще напутала?
SQL |
select *, case when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as UNSIGNED integer ) else cast(nomer_in as UNSIGNED integer) end as ind case when substring_index( nomer_in,'/',-1) > 0 then cast( substring_index(nomer_in, '/',-1) as UNSIGNED integer ) else 0 end as ind2 from mail order by ind, ind2 |
Ошибка
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'case when substring_index( nomer_in,'/',-1) > 0 then cast( substring_index(nome' at line 8
Спустя 4 минуты, 27 секунд (14.04.2009 - 09:50) kirik написал(а):
Цитата (sergeiss @ 14.04.2009 - 01:34) |
kirik - может мюзикл так и отсортирует, кто его знает smile.gif Но, опять же, у тебя не совсем правильный порядок сортировки получился. |
Сортирует
Нужно
128
128/1
128/2
128/3
вместо
128
128/3
128/2
128/1
?
Спустя 50 секунд (14.04.2009 - 09:51) sergeiss написал(а):
Yulk - нужна запятая после 'as ind'
А всё остальное (кроме отсутствия функции length()) выглядит очень даже правильно.
А всё остальное (кроме отсутствия функции length()) выглядит очень даже правильно.
Спустя 2 минуты, 52 секунды (14.04.2009 - 09:54) sergeiss написал(а):
kirik - в частном случае, может, и получится как ты говоршь.
Но я предлагаю (на мой взгляд) более универсальное решение. Которое будет работать с любой БД (ну, может, только с точностью до написания имен функций). И при этом можно делать разделители разных видов, и их может быть несколько в номере (например, тройной номер 1/34/7 вполне можно отсортировать по моему алгоритму).
Но я предлагаю (на мой взгляд) более универсальное решение. Которое будет работать с любой БД (ну, может, только с точностью до написания имен функций). И при этом можно делать разделители разных видов, и их может быть несколько в номере (например, тройной номер 1/34/7 вполне можно отсортировать по моему алгоритму).
Спустя 7 минут, 33 секунды (14.04.2009 - 10:01) kirik написал(а):
sergeiss, cоглашусь что твой вариант более гибкий и универсальный.
Но если заранее известно что все значения будут вида N/N или просто N, то вполне прокатит более простой вариант
Но если заранее известно что все значения будут вида N/N или просто N, то вполне прокатит более простой вариант
SQL |
SELECT * FROM `test_n` ORDER BY ABS(REPLACE(`t`, '/', '.')) ASC |
тоесть
SQL |
SELECT * FROM `mail` ORDER BY ABS(REPLACE(`nomer_in`, '/', '.')) ASC |
для таблицы Yulkи
Спустя 1 минута, 55 секунд (14.04.2009 - 10:03) Yulk написал(а):
Ура, все работает как надо!
Мне этот способ подходит, потому что в другой таблице номера вида
3-316-12/1
3-316-12/2
и их тоже надо будет сорировать...
sergeiss
спасибо большое за помощь!
Еще бы с постраничной навигацией с выводом номеров разобраться...
Мне этот способ подходит, потому что в другой таблице номера вида
3-316-12/1
3-316-12/2
и их тоже надо будет сорировать...
sergeiss
спасибо большое за помощь!
Еще бы с постраничной навигацией с выводом номеров разобраться...
Спустя 3 минуты, 43 секунды (14.04.2009 - 10:07) kirik написал(а):
Цитата (Yulk @ 14.04.2009 - 02:03) |
Мне этот способ подходит, потому что в другой таблице номера вида |
а что это за данные, если не секрет?
Спустя 3 минуты, 58 секунд (14.04.2009 - 10:11) sergeiss написал(а):
Цитата (Yulk @ 14.04.2009 - 10:03) |
sergeiss спасибо большое за помощь! Еще бы с постраничной навигацией с выводом номеров разобраться... |
Да не за что
Насчет постраничной навигации тут на форуме была куча тем и ссылок на описания.
Спустя 1 минута, 47 секунд (14.04.2009 - 10:12) Yulk написал(а):
kirik
Это страшный секрет!
А вообще-то просто номера исходящих писем...
Это страшный секрет!
А вообще-то просто номера исходящих писем...
Спустя 45 минут, 26 секунд (14.04.2009 - 10:58) Yulk написал(а):
Может подкажете еще чуток? Вот в этой же таблице после сортировки надо вывести наибольшее и наименьшее из сотни... С двойным запросом не хочется, поэтому если учесть что данные отсортированы в нужном порядке, надо просто взять первую и сотую запись?
запрос почти тот же:
запрос почти тот же:
SQL |
select *, case when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as UNSIGNED integer ) else cast(nomer_in as UNSIGNED integer) end as ind, case when substring_index( nomer_in,'/',-1) > 0 then cast( substring_index(nomer_in, '/',-1) as UNSIGNED integer ) else 0 end as ind2 from mail_ style='color:green'>in order by ind DESC, ind2 DESC LIMIT $start, $num |
а потом надо выбрать нужные значения... только вот тут у меня и не получается:
PHP |
$nom = mysql_query($query); |
Не бросайте меня, пожалуйста, чуть-чуть доделать осталось
Спустя 12 минут, 34 секунды (14.04.2009 - 11:10) sergeiss написал(а):
Во-первых, надо ДО цикла while объявить $num=array(); Тогда этой ошибки не будет (не должно быть).
Во-вторых... Индексы 0 и 100 подразумевают, что у тебя 101 элемент в массиве. Но ты делаешь лимит на 100 записей. Да еще их может быть меньше 100.
Поэтому... Для нахождения максимума-минимума внутри массива есть специальные функции. Названия их очень простые, каждое состоит из 3-х букв. Догадаешься сама, как их зовут?
И в-третьих... Тебе надо выбирать из запроса не элементы 'nomer_in', а элементы 'ind'. Потому что первые - это строки, а последние, с таким трудом "выцарапанные" нашими совместными усилиями как раз являются числами.
Во-вторых... Индексы 0 и 100 подразумевают, что у тебя 101 элемент в массиве. Но ты делаешь лимит на 100 записей. Да еще их может быть меньше 100.
Поэтому... Для нахождения максимума-минимума внутри массива есть специальные функции. Названия их очень простые, каждое состоит из 3-х букв. Догадаешься сама, как их зовут?
И в-третьих... Тебе надо выбирать из запроса не элементы 'nomer_in', а элементы 'ind'. Потому что первые - это строки, а последние, с таким трудом "выцарапанные" нашими совместными усилиями как раз являются числами.
Спустя 26 минут, 31 секунда (14.04.2009 - 11:37) Yulk написал(а):
Да, теперь все как надо! Спасибо огромное!
Спустя 5 часов, 32 минуты, 56 секунд (14.04.2009 - 17:10) Yulk написал(а):
Эх, только сейчас когда все это "присобачила" куда надо, заметила, что сортирует все-таки неправильно... при обратной сортировке у меня выдает
145
144
144/2
144/1
143
...
вроде же при сортировке по вторму индексу ему ноль присваивается если нет дроби - должен вставать перед 1....
145
144
144/2
144/1
143
...
вроде же при сортировке по вторму индексу ему ноль присваивается если нет дроби - должен вставать перед 1....
Спустя 1 час, 16 минут, 54 секунды (14.04.2009 - 18:27) Alchemist написал(а):
сорри что вмешиваюсь, но мне уже больно смотреть как вы мучаете мускуль
ИМХО, вариант kirik`a с "ORDER BY ABS(" самый лучший на данный момент. И если уж так важна универсальность, то никто не заставляет использовать именно REPLACE().
Вот более универсальный вариант (для поля VARCHAR(10)):
ИМХО, вариант kirik`a с "ORDER BY ABS(" самый лучший на данный момент. И если уж так важна универсальность, то никто не заставляет использовать именно REPLACE().
Вот более универсальный вариант (для поля VARCHAR(10)):
SQL |
SELECT * FROM `mail` ORDER BY RPAD(`nomer_in`, 10, ' ') DESC |
Спустя 1 час, 30 минут, 21 секунда (14.04.2009 - 19:57) sergeiss написал(а):
Yulk - сделай вывод этих ind и ind2 рядом с основными значениями, посмотри, какие у них величины.
Alchemist - а теперь отсортируй, плз, по твоему алгоритму строки 3-23-3/4, 34-2-4/1, 4-2-1, 3-4-8/2. Что получишь?
Alchemist - а теперь отсортируй, плз, по твоему алгоритму строки 3-23-3/4, 34-2-4/1, 4-2-1, 3-4-8/2. Что получишь?
Спустя 16 часов, 35 минут, 36 секунд (15.04.2009 - 12:33) Yulk написал(а):
Нда, действительно, там где нет дроби ind2 равен ind...
Спустя 20 минут, 29 секунд (15.04.2009 - 12:53) sergeiss написал(а):
Я еще раньше говорил: при получении ind2 вместо substring_index( nomer_in,'/',-1) > 0 напиши length( when substring_index( nomer_in,'/',-1) ) > 0
Должно помочь.
Должно помочь.
Спустя 57 минут, 30 секунд (15.04.2009 - 13:51) Yulk написал(а):
Так и стоит
SQL |
select *, case when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as UNSIGNED integer ) else cast(nomer_in as UNSIGNED integer) end as ind, case when length(substring_index( nomer_in,'/',-1)) > 0 then cast( substring_index(nomer_in, '/',-1) as UNSIGNED integer ) else 0 end as ind2 from mail order by ind DESC, ind2 DESC LIMIT $start, $num |
Спустя 8 минут, 53 секунды (15.04.2009 - 14:00) sergeiss написал(а):
Э....
У меня хоть и написано под аватаром Эксперт, но и другому человек думать тоже не повредит
На самом деле там нужно другое условие. Потому что substring_index( nomer_in,'/',-1) при отсутствии слэша вернет на самом деле всю строку.
Тут надо, я думаю окончательно уже , поставить условие
У меня хоть и написано под аватаром Эксперт, но и другому человек думать тоже не повредит
На самом деле там нужно другое условие. Потому что substring_index( nomer_in,'/',-1) при отсутствии слэша вернет на самом деле всю строку.
Тут надо, я думаю окончательно уже , поставить условие
SQL |
if locate('/', nomer_in) > 0 then cast ... и далее по старому тексту |
Спустя 8 минут, 34 секунды (15.04.2009 - 14:08) Yulk написал(а):
А ведь и правда...
Никудышный из меня программист
Но даже не думайте, не брошу, все равно буду этим заниматься и вас, экспертов, мучить
Никудышный из меня программист
Но даже не думайте, не брошу, все равно буду этим заниматься и вас, экспертов, мучить