MySQL按2个日期列排序,以较大者

时间:2018-01-10 12:00:48

标签: mysql sql

我今天遇到了一个调试一些代码的问题:给出以下内容 MySQL数据片段:

╔════╦═════════════════════╦═════════════════════╗
║ id ║ date_created        ║ date_updated        ║
╠════╬═════════════════════╬═════════════════════╣
║ 1  ║ 2015-12-07 15:04:21 ║ 2016-06-06 10:59:25 ║
╠════╬═════════════════════╬═════════════════════╣
║ 2  ║ 2016-06-06 10:59:25 ║ 2016-09-09 09:44:58 ║
╠════╬═════════════════════╬═════════════════════╣
║ 3  ║ 2016-09-09 09:44:59 ║ 2017-11-30 11:36:37 ║
╠════╬═════════════════════╬═════════════════════╣
║ 4  ║ 2017-11-30 11:36:37 ║ null                ║
╚════╩═════════════════════╩═════════════════════╝

我需要相应地对这些日期进行排序:

  1. 如果条目date_updatednull,请使用其date_created
  2. 如果条目date_updated > date_created然后使用其date_updated(尽管情况应该如此)
  3. 如果比较两个条目A,B,其中A只有date_created且B的date_updated不为空并且这两个值相等,那么A应该比B更大。
  4. 所以我的预期结果应该是:

    ╔════╦═════════════════════╦═════════════════════╗
    ║ id ║ date_created        ║ date_updated        ║
    ╠════╬═════════════════════╬═════════════════════╣
    ║ 4  ║ 2017-11-30 11:36:37 ║ null                ║
    ╠════╬═════════════════════╬═════════════════════╣
    ║ 3  ║ 2016-09-09 09:44:59 ║ 2017-11-30 11:36:37 ║
    ╠════╬═════════════════════╬═════════════════════╣
    ║ 2  ║ 2016-06-06 10:59:25 ║ 2016-09-09 09:44:58 ║
    ╠════╬═════════════════════╬═════════════════════╣
    ║ 1  ║ 2015-12-07 15:04:21 ║ 2016-06-06 10:59:25 ║
    ╚════╩═════════════════════╩═════════════════════╝
    

    我尝试过以下查询:

    SELECT * FROM table t
    ORDER BY
      CASE
        WHEN t.date_updated IS NOT NULL AND t.date_updated > t.dated_created
        THEN t.date_created
        ELSE t.date_updated
      END
    DESC
    

    然而,根据第2点,这并没有正确排序。 这里正确的MySQL语句是什么?

2 个答案:

答案 0 :(得分:1)

您的案例陈述的逻辑是不正确的。错误地,你已经交换了t.date_updated和t.date_created(检查下面SQL查询中的第5行和第6行)

试试这个

SELECT * FROM table t
ORDER BY
  CASE
    WHEN t.date_updated IS NOT NULL AND t.date_updated > t.dated_created
    THEN t.date_updated
    ELSE t.date_created
  END
DESC

答案 1 :(得分:0)

date_updated优先于date_created。请使用COALESCE

SELECT * 
FROM mytable
ORDER BY COALESCE(date_updated, date_created) DESC;