MySQL按给定顺序selectWHERE IN

我有类似的东西

SELECT * FROM table WHERE id IN (118,17,113,23,72); 

如果我只是这样做,它返回ID升序的行。 有没有办法按照IN语句中给出的顺序取回行?

你应该使用“ORDER BY FIELD”。 所以,例如:

 SELECT * FROM table WHERE id IN (118,17,113,23,72) ORDER BY FIELD(id,118,17,113,23,72) 

尝试使用FIND_IN_SET

 SELECT * FROM table WHERE id IN (118,17,113,23,72) ORDER BY FIND_IN_SET(id, '118,17,113,23,72'); 

您可以使用两列(ID,order_num)创build临时表:

 ID order_num 118 1 17 2 113 3 23 4 72 5 

然后join:

 SELECT * from table INNER JOIN #temp_table ON table.id = #temp_table.id 

注意你可以删除IN子句。

有时我实际上创build一个永久表,因为那么当客户不可避免地改变他们对订购的想法时,我不必触摸代码,只是表。

编辑

使用ORDER BY FIELD() (我不知道)的答案可能是你想要的。

一种select是使用UNION:

 SELECT * FROM table WHERE id = 118 UNION SELECT * FROM table WHERE id = 17 UNION SELECT * FROM table WHERE id = 113 ... 

您可以创build一个数字,根据id值进行sorting:

 select * from table where id in (118,17,113,23,72) order by case id when 118 then 1 when 17 then 2 when 133 then 3 when 23 then 4 when 72 then 5 end 

这是第一个想到的东西。 注意sql未经testing,您可能需要检查正确的语法

它有点麻烦,但可能会做的伎俩

 select * from table where id = 118 union select * from table where id = 17 union .... and so on 

我想如果你用每个select都做了UNION查询,它可能会按顺序返回。

 SELECT * FROM table WHERE id=118 UNION SELECT * FROM table WHERE id=17 ... 

丑,但我认为它会奏效。