Возврат результатов запроса в предопределенный порядок
Можно ли сделать инструкцию 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