Возврат результатов запроса в предопределенный порядок

Можно ли сделать инструкцию SELECT с заданным порядком, т.е. выбирая идентификаторы 7,2,5,9 и 8 и возвращая их в этом порядке, на основе не более чем поля ID?

Заявления SELECT id FROM table WHERE id в (7,2,5,9,8); и SELECT id FROM table WHERE id в (8,2,5,9,7); оба возвращают их в том же порядке.

Ответы

Ответ 1

Я не думал, что это возможно, но здесь найдено запись в блоге, которая, похоже, делает то, что вам нужно:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8");

даст разные результаты

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7");

FIND_IN_SET возвращает позицию id во втором аргументе, указанном для него, поэтому для первого случая выше id of 7 находится в позиции 1 в наборе, 2 в 2 и так далее - mysql внутренне что-то вроде

id | FIND_IN_SET
---|-----------
7  | 1
2  | 2
5  | 3

затем заказы по результатам FIND_IN_SET.

Ответ 2

ПОРЯДОК ПОЛЯ (ID, 7,2,4,5,8) - ваш лучший выбор, но он все еще уродлив.

Ответ 3

Не могли бы вы включить выражение case, которое отображает ваши идентификаторы 7,2,5,... в ординалы 1,2,3,... и затем упорядочивает это выражение?

Ответ 4

Все заказы выполняются ключевыми словами ORDER BY, однако вы можете сортировать только по возрастанию и по убыванию. Если вы используете такой язык, как PHP, вы можете отсортировать их соответствующим образом с помощью некоторого кода, но я не считаю, что это возможно только с MySQL.

Ответ 5

Это работает в Oracle. Можете ли вы сделать что-то подобное в MySql?

SELECT ID_FIELD
FROM SOME_TABLE
WHERE ID_FIELD IN(11,10,14,12,13)
ORDER BY
  CASE WHEN ID_FIELD = 11 THEN 0
       WHEN ID_FIELD = 10 THEN 1
       WHEN ID_FIELD = 14 THEN 2
       WHEN ID_FIELD = 12 THEN 3
       WHEN ID_FIELD = 13 THEN 4
  END

Ответ 6

Возможно, вам понадобится создать временную таблицу с полем autonumber и вставить в нее в нужном порядке. Затем выполните сортировку по новому полю autonumber.

Ответ 7

Это взломанный (и, вероятно, медленный), но вы можете получить эффект с помощью UNION ALL:

SELECT id FROM table WHERE id = 7
UNION ALL SELECT id FROM table WHERE id = 2
UNION ALL SELECT id FROM table WHERE id = 5
UNION ALL SELECT id FROM table WHERE id = 9
UNION ALL SELECT id FROM table WHERE id = 8;

Изменить: Другие люди упомянули функцию find_in_set, которая документирована здесь.

Ответ 8

Эмм, на самом деле. Ближе всего вы можете получить, вероятно:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3

Но вы, вероятно, этого не хотите:)

Трудно дать вам более конкретный совет без дополнительной информации о том, что в таблицах.

Ответ 9

Вы быстро получаете ответы здесь, не так ли?

Причина, по которой я спрашиваю, заключается в том, что это единственный способ, которым я могу думать, чтобы избежать сортировки сложного многомерного массива. Я не говорю, что это будет сложно сортировать, но если бы был простой способ сделать это с прямым sql, то почему бы и нет.

Ответ 10

Одно решение Oracle:

SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6);

Это присваивает номер заказа каждому идентификатору. Работает нормально для небольшого набора значений.

Ответ 11

Лучший, о котором я могу думать, заключается в добавлении второго столбца OrderColumn:

7 1
2 2
5 3
9 4 
8 5

И тогда просто сделайте ORDER BY orderColumn