一尘不染

在MySQL“ IN”查询中维护顺序

mysql

我有下表

DROP TABLE IF EXISTS `test`.`foo`;
CREATE TABLE  `test`.`foo` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

然后我尝试根据主键获取记录

SELECT * FROM foo f where f.id IN (2, 3, 1);

然后我得到以下结果

+----+--------+
| id | name   |
+----+--------+
|  1 | first  |
|  2 | second |
|  3 | third  |
+----+--------+
3 rows in set (0.00 sec)

可以看到,结果按ID排序。我试图实现的结果是按照查询中提供的顺序对结果进行排序。给定这个例子,它应该返回

+----+--------+
| id | name   |
+----+--------+
|  2 | second |
|  3 | third  |
|  1 | first  |
+----+--------+
3 rows in set (0.00 sec)

阅读 229

收藏
2020-05-17

共1个答案

一尘不染

正如另一个答案所提到的:您发布的查询与您想要的结果顺序无关,而只是您想要的结果。

为了订购您的结果,我将使用ORDER BY FIELD():

SELECT * FROM foo f where f.id IN (2, 3, 1)
ORDER BY FIELD(f.id, 2, 3, 1);

FIELD的参数列表可以是可变长度。

2020-05-17