помогите с сортировкой

Статус
В этой теме нельзя размещать новые ответы.

Shmaltorhbooks

Создатель
Регистрация
24 Июн 2007
Сообщения
20
Реакции
3
есть табличка произвольной структуры, в ней есть поле, допустим, id.
необходимо составить запрос типа
PHP:
select * from table where `id` in (4,6,1,15,24,58,7,11)
но с таким условием, чтоб MySQL вернул строки именно в том порядке, в котором они указаны в условии.
Иными словами - можно ли получить результаты запроса именно в таком порядке, как мне надо, а не посортированными по order by или тому, как указано в спецификации?
 
Нет. Как вариант использовать union.

Код:
[COLOR=#000000][FONT=Courier New][COLOR=#0000bb]select 1 AS SortOrder, [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]from table where [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` = 4[/COLOR][/FONT][/COLOR]
[COLOR=#000000][FONT=Courier New][COLOR=#007700]UNION ALL[/COLOR][/FONT][/COLOR]
[COLOR=#000000][FONT=Courier New][COLOR=#007700][COLOR=#000000][FONT=Courier New][COLOR=#0000bb]select 2 AS SortOrder, [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]from table where [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` = 6[/COLOR][/FONT][/COLOR]
[COLOR=#000000][FONT=Courier New][COLOR=#007700][COLOR=#000000][FONT=Courier New][COLOR=#007700]UNION ALL[/COLOR][/FONT][/COLOR]
[/COLOR][/FONT][/COLOR][COLOR=#000000][FONT=Courier New][COLOR=#007700][COLOR=#000000][FONT=Courier New][COLOR=#0000bb]select 3 AS SortOrder, [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]from table where [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` = 1[/COLOR][/FONT][/COLOR]
[COLOR=#000000][FONT=Courier New][COLOR=#007700]....[/COLOR][/FONT][/COLOR]
[COLOR=#000000][FONT=Courier New][COLOR=#007700][COLOR=#000000][FONT=Courier New][COLOR=#007700]ORDER BY [COLOR=#0000bb]SortOrder[/COLOR][/COLOR][/FONT][/COLOR]
[/COLOR][/FONT][/COLOR][/COLOR][/FONT][/COLOR][/COLOR][/FONT][/COLOR]
 
Код:
[COLOR=#000000][COLOR=#0000bb]select [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]from table where [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]in [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]4[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]6[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]15[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]24[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]58[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]7[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]11[/COLOR][COLOR=#007700]) 
order by [/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]4[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]6[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]1[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]15[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]24[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]58[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]7[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]11[/COLOR][/COLOR] DESC
 
Ого. И это правда работает? Начиная с какой версии?

А что будет, если в order by пропустить парочку id=...?
Запрос упадет или эти записи с этизначения будут снизу в случайном порадке?

А почему именнто DESC? Что изменится, если написать id=6 ASC, а остальное оставить DESC?


Код:
[COLOR=#000000][COLOR=#0000bb]select [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]from table where [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]in [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]4[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]6[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]15[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]24[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]58[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]7[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]11[/COLOR][COLOR=#007700]) 
order by [/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]4[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]6[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]1[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]15[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]24[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]58[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]7[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]11[/COLOR][/COLOR] DESC
 
если DESC убрать то сортировка будет от конца, тогда точно чтоб покороче было можно и наоборот сделать равенство заменить неравенством
Код:
SELECT * FROM table
WHERE id IN (1,2,3,4)
ORDER BY id!=2, id!=3, id!=1
ответ будет: 2,3,1,4

Это сортировка по условию если условие выполняется то true (1), если нет то false (0), а сортировка выполняется с нуля (0,1,2,3...) вот и выходит наоборот.

Вобщем если следовать стандартному sql запросу то он не позволяет использовать выражения в сортировке и тем более когда не указана колонка, но mysql позволяет.

Если по стандартному sql, то запрос будет такой:
Код:
SELECT *, IF(id!=2,1,0) id1, IF(id!=3,1,0) id2, IF(id!=1,1,0) id3 FROM table
WHERE id IN (4,1,2,3)
ORDER BY id1, id2, id3
и в колонках id1, id2, id3 видно как сортируется, но mysql выражения в сортировке разрешает значит можно условия перенести в сортирование, тогда будет
Код:
SELECT * FROM table
WHERE id IN (4,1,2,3)
ORDER BY IF(id!=2,1,0), IF(id!=3,1,0), IF(id!=1,1,0)
но неравенство и так возвращает 0 или 1 поэтому просто id!=2 и т. д.

про версию вроде начиная с 3 есть поддержка выражений в сортировке
 
Код:
[COLOR=#000000][COLOR=#0000bb]select [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]from table where [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]in [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]4[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]6[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]15[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]24[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]58[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]7[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]11[/COLOR][COLOR=#007700]) 
order by [/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]4[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]6[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]1[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]15[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]24[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]58[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]7[/COLOR][/COLOR] DESC[COLOR=#000000][COLOR=#007700],[/COLOR][/COLOR]id=[COLOR=#000000][COLOR=#0000bb]11[/COLOR][/COLOR] DESC


крутая тема.
попробовал в mssql - там не работает
 
крутая тема.
попробовал в mssql - там не работает

В Oracle так думаю тоже не сработает. А где же тогда это сработает?
Мне в голову не укладывается такой способ написания order by. Он несколько нелогичен. Несколько раз проверил - письмо написано не 1го апреля...

Вообще такая задача должна решаться по другому, имхо.
 
Можно сделать реализацию следующей:
в таблице table2 уже есть эти данные
key_id (1,2,3,4,5,6,7,8)
id (4,6,1,15,24,58,7,11)
key_id - просто автоинкрементное поле.


потом просто джойним таблицу 2 к таблице 1 и сортируем по 2й таблице по автоинкрементному полю key_id

select * from table1
inner join table2 on (table1.id=table2.id)
order by table2.key_id
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху