【发布时间】:2010-03-15 05:20:02
【问题描述】:
我有 3 个字段的“任务”表:
- 日期
- 优先级 (0,1,2)
- 完成 (0,1)
我想要实现的是整个表按完成标志排序,未完成的任务应按优先级排序,而已完成的任务应按日期排序:
- Select * from tasks order by done asc
- 如果 done=0 则另外按优先级顺序排序
- 如果 done=1 则额外按日期顺序排序
是否可以在没有联合的情况下在 MySQL 中执行此操作?
谢谢。
【问题讨论】:
我有 3 个字段的“任务”表:
我想要实现的是整个表按完成标志排序,未完成的任务应按优先级排序,而已完成的任务应按日期排序:
是否可以在没有联合的情况下在 MySQL 中执行此操作?
谢谢。
【问题讨论】:
您可以尝试ORDER BY (done asc, aux desc),其中 aux 使用CASE 计算,以根据done 的值产生优先级或日期(您可能必须将它们强制转换为相同的类型以适应相同的表达式,例如,将日期转换为合适的整数天数)。
例如:
SELECT * FROM tab
ORDER BY done desc,
case done
when 0 then prio
else to_days(thedate)
end desc;
【讨论】:
取自 Alex Martelli,刚刚使用 IF() 缩短了一点,并修复了 ASC/DESC 排序
SELECT * FROM tab
ORDER BY done ASC, IF(done, to_days(thedate), prio) DESC;
【讨论】: