MySQL排序需求:未来日期优先,空日期介于未来与过去日期之间
调整日期排序逻辑的解决方案
首先明确你的排序优先级:
- 第一优先级:未来日期(
expiry_date > CURDATE())排在最前,内部按expiry_date升序排列(最近的未来日期在前) - 第二优先级:空日期(
expiry_date IS NULL)排在中间,需指定内部排序规则来调整id29的位置 - 第三优先级:过去日期(
expiry_date < CURDATE())排在最后,内部按expiry_date降序排列(最近的过去日期在前)
原查询的问题在于空日期分组没有指定排序规则,数据库会按默认存储顺序返回,导致id29的位置不符合预期。以下是修改后的查询语句:
SELECT id, expiry_date, issued_date FROM document ORDER BY -- 先按分组优先级排序:未来(0) → 空日期(1) → 过去(2) CASE WHEN expiry_date > CURDATE() THEN 0 WHEN expiry_date IS NULL THEN 1 ELSE 2 END ASC, -- 未来日期按expiry_date升序 CASE WHEN expiry_date > CURDATE() THEN expiry_date END ASC, -- 空日期按id排序(可替换为issued_date等字段,确保id29处于23和22之间) CASE WHEN expiry_date IS NULL THEN id END ASC, -- 过去日期按expiry_date降序 CASE WHEN expiry_date < CURDATE() THEN expiry_date END DESC
关键修改说明:
- 用
CASE语句明确划分三个分组的优先级,避免原语句中NULL比较的不确定性 - 为空日期分组添加了明确的排序字段(示例中用
id ASC),你可以根据实际需求替换为issued_date或其他字段,确保id29的位置符合预期 - 保留了未来/过去日期的内部排序规则,符合你的原始需求
内容的提问来源于stack exchange,提问作者shayanmalinda
相关产品推荐
相关产品推荐

