通过IN子句对MySQL查询结果进行排序

时间:2012-04-18 16:51:52

标签: mysql sorting

我有像这样的mysql

SELECT * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)

有什么方法可以得到id在IN子句中的顺序排序的查询结果?

非常感谢

更新:i've just found this question covered here 虽然我的IN子句确实包含多达5000个id,所以使用'FIELD'是最好的解决方案吗?

4 个答案:

答案 0 :(得分:6)

如果你不介意重复id序列,使用ORDER BY FIELD应该可以做到这一点:

SELECT * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)
ORDER BY FIELD (id,3245,76,3466,998,12984,4466,931,50,728)

正如@vyegorov在评论中指出的那样,对于大量的ID,您可能必须创建一个临时表来保存实际的订单

CREATE TEMPORARY TABLE `temp_sort` (
    `id` INT NOT NULL ,
    `seq` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    PRIMARY KEY ( `seq` ) ,
    UNIQUE ( `id` )
);

INSERT INTO temp_sort (id) VALUES (3245),(76),(3466);

SELECT * FROM table  
INNER JOIN temp_sort ON (temp_sort.id=table.id)
ORDER BY temp_sort.seq;

答案 1 :(得分:1)

由于IN子句中最多有5000个项目,因此您需要创建一个单独的表,其中包含您要包含的ID列表。在该表中放置一个订单列,然后按订单列执行内部联接和订购。这解决了这两个问题。

像这样:

SELECT table.*
FROM table
INNER JOIN tblIDs ON tblIDs.id = table.id
ORDER BY tblIDs.OrderValue

你的新表(tblIDs)看起来像这样:

id     OrderValue
3245        1
76          2
3466        3

通过在id列上执行INNER JOIN,您将确保仅显示原始表中具有您列出的ID号之一的那些行。 OrderValue列允许您轻松高效地对查询进行排序,它还允许您轻松更改排序顺序,而不会将查询分开。

答案 2 :(得分:0)

除非您将这些ID设为属性。即使这样,它也会命令它们asc / desc,而不是像你拥有它们那样无序。

答案 3 :(得分:0)

尝试这样做。

SELECT your_column_name * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)      
ORDER BY your_column_name
相关问题