2011-01-19 60 views
1

回到我沿着这些路线SQL语句的东西行顺序:MySQL的:指定我想在

SELECT * FROM `table` WHERE some_column IN(1,58,22,9); 

我想的是返回的行以相同的顺序为some_column值指定的,即1前58之前22之前22之前9.问题是,我没有列,当排序时,会产生这种特定的行顺序。

有什么办法可以实现这个目标吗?

回答

4

使用FIND_IN_SET function

SELECT * 
    FROM `table` 
    WHERE some_column IN(1,58,22,9) 
ORDER BY FIND_IN_SET(some_column, '1,58,22,9') 
+0

+1好的替代CASE – 2011-01-19 20:52:33

3

可以使用case实现几乎任何排序顺序:

select * 
from TheTable 
where some_column in (1,58,22,9) 
order by 
     case some_column 
      when 9 then 1 
      when 22 then 2 
      when 58 then 3 
      when 1 then 4 
     end 
+0

+1:对于ANSI的方式做 – 2011-01-19 21:03:47

+0

我退出了投票,但我喜欢SQL92 – RichardTheKiwi 2011-01-19 21:08:31

0

有一对夫妇在这里已经为使用SQL语句排序良好的解决方案。但采取这种方法的缺点是缺乏灵活性:每次需要选择不同的值集时,都必须修改SQL语句。

如果您只是简单地分析数据,但如果您很可能需要重新运行查询或修改查询,或者实际上这是用于任何类型的生产环境,那么更好的解决方案是使用排序表。这应该包含两列 - 您的源代码和排序值 - 然后编写执行连接的SQL并返回按排序列排序的值。

例如:

TheSortTable 
SomeColumn SortValue 
9   1 
22   2 
58   3 
1   4 

的你的SQL是

SELECT SomeColumn, SomeValue FROM TheTable 
INNER JOIN TheSortTable on TheTable.SomeColumn = TheSortTable.SomeColumn 
WHERE SomeColumn IN(1,58,22,9) 
ORDER BY SortValue 

具体而言,这是一个远远优于明确直接编码解决方案到SQL比一个严格的一次性的其他任何查询(事实上,这种方法的一般理念值得更广泛地采用)。