我有类似
的东西SELECT * FROM table WHERE id IN (118,17,113,23,72);
如果我这样做,它会以ID升序返回行。有没有办法按IN语句中给出的顺序取回行?
答案 0 :(得分:91)
您应该使用“ORDER BY FIELD”。所以,例如:
SELECT * FROM table WHERE id IN (118,17,113,23,72)
ORDER BY FIELD(id,118,17,113,23,72)
答案 1 :(得分:12)
尝试使用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');
答案 2 :(得分:2)
您可以创建一个包含两列(ID,order_num)的临时表:
ID order_num
118 1
17 2
113 3
23 4
72 5
然后加入:
SELECT * from table
INNER JOIN #temp_table
ON table.id = #temp_table.id
请注意,您可以删除IN
子句。
有时我实际创建了一个永久表,因为当客户端不可避免地改变他们对排序的想法时,我不必触及代码,只需要表格。
修改强>
使用ORDER BY FIELD()(我不知道)的答案可能就是你想要的。
答案 3 :(得分:0)
一种选择是使用UNION:
SELECT * FROM table WHERE id = 118
UNION
SELECT * FROM table WHERE id = 17
UNION
SELECT * FROM table WHERE id = 113
...
答案 4 :(得分:0)
您可以根据ID值创建一个要排序的数字:
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
答案 5 :(得分:0)
这是首先想到的东西。 注意sql未经测试,您可能需要检查正确的语法
它有点麻烦,但可能会做到这一点
select * from table where id = 118
union
select * from table where id = 17
union
.... and so on
答案 6 :(得分:0)
我认为如果你对每个选择进行UNION
查询,它可能会按顺序返回。
SELECT * FROM table WHERE id=118
UNION
SELECT * FROM table WHERE id=17
...
丑陋,但我认为它会起作用。