MySQL:指定我想要返回行的顺序

时间:2011-01-19 20:49:19

标签: sql mysql

我有一条SQL语句:

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

我想要的是按照指定some_column值的顺序返回行,即在之前的22之前的58之前返回行。问题是我没有列,当排序时,将会产生这种特定的行顺序。

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

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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

答案 2 :(得分: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中(事实上,该方法的一般原则是值得采用的更广泛的一种)。