按价值排序,但忽略零

时间:2015-11-21 23:24:20

标签: mysql

你能帮助我吗?

我正在为日历做一个简单的SQL查询,根据它们的值列出许多值(日期,时间等为UNIX时间),并且限制为5个条目。

查询字符串的相关部分是:

ORDER BY specialtime DESC, `start` ASC, programstart ASC

名为“specialtime”的列列出了这些值:

432000
259200
172800
0
0
0
0

这几乎没问题 - 但是我想要一个值为零的条目,不同于零以升序显示 - 在它们之后,其余的,也是提升......就像这样:

172800
259200
432000
0
0
0
0

有没有办法在SQL中实现这一点而不依赖于后处理值?

1 个答案:

答案 0 :(得分:6)

检查特殊时间是否为0并主要按该表达式排序:

ORDER BY specialtime = 0, specialtime ASC, `start` ASC, programstart ASC

MySQL treats boolean expressions as integers,因此false计算结果为0,true计算结果为1.您可以按这样的表达式排序,并将specialtime = 0计算结果为true的每一行移动到列表的底部。

或者,稍微长一点,但也更便携,也许更容易理解:

ORDER BY CASE WHEN specialtime = 0 THEN 1 ELSE 0 END, specialtime ASC, `start` ASC, programstart ASC

CASE表达式返回0(特殊时间不为0)或1(如果specialtime为0)。查询主要按此值排序,因此所有0次都位于列表的底部。所以基本上功能是相同的,但case版本更具可移植性,因为没有多少数据库允许按布尔表达式排序。

specialtime的值用于辅助排序,因此当specialtime = 0返回false时,对于该组,记录仍按特殊时间的实际值排序。