你能帮助我吗?
我正在为日历做一个简单的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中实现这一点而不依赖于后处理值?
答案 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时,对于该组,记录仍按特殊时间的实际值排序。