我今天遇到了一个调试一些代码的问题:给出以下内容 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 ║
╚════╩═════════════════════╩═════════════════════╝
我需要相应地对这些日期进行排序:
date_updated
为null
,请使用其date_created
date_updated > date_created
然后使用其date_updated
(尽管情况应该如此)date_created
且B的date_updated
不为空并且这两个值相等,那么A应该比B更大。所以我的预期结果应该是:
╔════╦═════════════════════╦═════════════════════╗
║ 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语句是什么?
答案 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;