我有一条SQL语句:
SELECT * FROM `table` WHERE some_column IN(1,58,22,9);
我想要的是按照指定some_column
值的顺序返回行,即在之前的22之前的58之前返回行。问题是我没有列,当排序时,将会产生这种特定的行顺序。
有什么方法可以实现这个目标吗?
答案 0 :(得分:4)
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中(事实上,该方法的一般原则是值得采用的更广泛的一种)。