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

Тема в разделе "Базы данных", создана пользователем Shmaltorhbooks, 27 апр 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Shmaltorhbooks

    Shmaltorhbooks Создатель

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

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Нет. Как вариант использовать 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]
     
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    Код:
    [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
    
     
    Shmaltorhbooks нравится это.
  4. vgvgvg

    vgvgvg Создатель

    Регистр.:
    16 июн 2010
    Сообщения:
    39
    Симпатии:
    1
    Ого. И это правда работает? Начиная с какой версии?

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

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


     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    если 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 есть поддержка выражений в сортировке

    http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html
     
  6. sage.scs

    sage.scs Создатель

    Регистр.:
    1 фев 2009
    Сообщения:
    10
    Симпатии:
    0

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

    vgvgvg Создатель

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

    Вообще такая задача должна решаться по другому, имхо.
     
  8. DonySuXX

    DonySuXX Писатель

    Регистр.:
    7 июл 2008
    Сообщения:
    7
    Симпатии:
    0
    Можно сделать реализацию следующей:
    в таблице 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
     
Статус темы:
Закрыта.