MySQL按给定顺序选择WHERE IN

时间:2010-09-26 21:39:35

标签: mysql

我有类似

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

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

7 个答案:

答案 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
...

丑陋,但我认为它会起作用。