MySQL'IN'子句和返回的记录集顺序

时间:2009-09-03 11:29:44

标签: sql mysql

例如:从T中选择*,其中T.id IN(4,78,12,45)

我希望返回的记录集按“IN”子句中的位置排序。 我怎么能这样做?

3 个答案:

答案 0 :(得分:20)

您可以使用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');

虽然您必须复制列表,但如果您在代码中生成查询,则这不是一个大问题。

答案 1 :(得分:1)

在一般情况下,你不能。 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

答案 2 :(得分:0)

您不能通过IN子句订购。您必须提供单独的ORDER BY子句。通过在ORDER BY中构建case语句,可以采用以下方法。但它并不漂亮。

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