Предложение 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
Другие вопросы по тегам