Предложение MySQL "IN" и возвращенный порядок набора записей
Например: выберите * из T, где T.id IN(4,78,12,45)
Я хочу, чтобы возвращаемая запись была установлена только на порядок по позиции в предложении IN. Как я могу это сделать?
3 ответа
Вы можете сделать это с помощью FIND_IN_SET, например,
SELECT * FROM T WHERE T.id IN(4,78,12,45)
ORDER BY FIND_IN_SET(T.id,'4,78,12,45');
Хотя вы должны дублировать список, если вы генерируете запрос в коде, это не является большой проблемой.
В общем случае вы не можете. SQL не гарантирует порядок, если вы не используете ORDER BY
пункт, и он не может быть привязан к содержанию IN
заявление.
Однако, если вы можете построить временную таблицу, которая упорядочивает значения, из которых вы выбираете, вы можете присоединиться к этой таблице и упорядочить ее.
Например, у вас есть временная таблица, которая содержит что-то вроде следующего:
id | order
----+------
4 | 1
78 | 2
12 | 3
45 | 4
Тогда вы можете заказать его так:
SELECT T.*
FROM T
INNER JOIN temp
ON T.id = temp.id
ORDER BY temp.order ASC
Вы не можете сделать заказ по предложению IN. Вы должны предоставить отдельное предложение ORDER BY. Один из способов сделать это - создать оператор case в ORDER BY. Это не красиво, хотя.
SELECT
*
FROM
T
WHERE
T.Id IN(4, 78, 12, 45)
ORDER BY
CASE
WHEN T.Id = 4 THEN 1
WHEN T.Id = 78 THEN 2
WHEN T.Id = 12 THEN 3
WHEN T.Id = 45 THEN 4
END