【问题标题】:Conditional sorting in MySQL?MySQL中的条件排序?
【发布时间】:2010-03-15 05:20:02
【问题描述】:

我有 3 个字段的“任务”表:

  1. 日期
  2. 优先级 (0,1,2)
  3. 完成 (0,1)

我想要实现的是整个表按完成标志排序,未完成的任务应按优先级排序,而已完成的任务应按日期排序:

  1. Select * from tasks order by done asc
  2. 如果 done=0 则另外按优先级顺序排序
  3. 如果 done=1 则额外按日期顺序排序

是否可以在没有联合的情况下在 MySQL 中执行此操作?

谢谢。

【问题讨论】:

    标签: sql mysql sorting


    【解决方案1】:

    您可以尝试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;
    

    【讨论】:

    • 啊,我猜 MySQL 会自动转换——嗯,总是很难猜到 MySQL 会在哪里自动转换,哪里不会!-)
    【解决方案2】:

    取自 Alex Martelli,刚刚使用 IF() 缩短了一点,并修复了 ASC/DESC 排序

    SELECT * FROM tab
    ORDER BY done ASC, IF(done, to_days(thedate), prio) DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多