我有一个这样的mysql
SELECT * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)
有什么办法可以让查询的结果按照 ID 在 IN 子句中的顺序排序?
非常感谢
更新:我刚刚在这里发现了这个问题, 尽管如此,我的 IN 子句确实包含多达 5000 个 id,那么使用“FIELD”会是最好的解决方案吗?
我有一个这样的mysql
SELECT * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)
有什么办法可以让查询的结果按照 ID 在 IN 子句中的顺序排序?
非常感谢
更新:我刚刚在这里发现了这个问题, 尽管如此,我的 IN 子句确实包含多达 5000 个 id,那么使用“FIELD”会是最好的解决方案吗?
如果您不介意重复 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;
由于您的 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 列将允许您轻松有效地对查询进行排序,它还允许您轻松更改排序顺序,而无需拆分查询。
除非您将这些 id 设置为属性。即使那样,它也会按顺序排列它们,而不是像你有它们那样乱序。
尝试这样做。
SELECT your_column_name * FROM table WHERE id IN(3245,76,3466,998,12984,4466,931,50,728)
ORDER BY your_column_name