回到我沿着这些路线SQL语句的东西行顺序:MySQL的:指定我想在
SELECT * FROM `table` WHERE some_column IN(1,58,22,9);
我想的是返回的行以相同的顺序为some_column
值指定的,即1前58之前22之前22之前9.问题是,我没有列,当排序时,会产生这种特定的行顺序。
有什么办法可以实现这个目标吗?
回到我沿着这些路线SQL语句的东西行顺序:MySQL的:指定我想在
SELECT * FROM `table` WHERE some_column IN(1,58,22,9);
我想的是返回的行以相同的顺序为some_column
值指定的,即1前58之前22之前22之前9.问题是,我没有列,当排序时,会产生这种特定的行顺序。
有什么办法可以实现这个目标吗?
SELECT *
FROM `table`
WHERE some_column IN(1,58,22,9)
ORDER BY FIND_IN_SET(some_column, '1,58,22,9')
可以使用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
+1:对于ANSI的方式做 – 2011-01-19 21:03:47
我退出了投票,但我喜欢SQL92 – RichardTheKiwi 2011-01-19 21:08:31
有一对夫妇在这里已经为使用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比一个严格的一次性的其他任何查询(事实上,这种方法的一般理念值得更广泛地采用)。
+1好的替代CASE – 2011-01-19 20:52:33