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 ...
丑,但我认为它会奏效。