MySQL中如何按字段的条件组合实现排序?
在MySQL中按多字段条件组合实现自定义排序
针对你的需求,我们可以用CASE语句在ORDER BY子句中定义多条件的排序优先级,完美实现你想要的排序效果:
最终SQL语句
CREATE TABLE Demo (JobID INT(11), Status VARCHAR(250), InvoiceStatus VARCHAR(250)); INSERT INTO Demo (JobID, Status, InvoiceStatus) VALUES (1, "Active", NULL), (2, "Cancelled", NULL), (3, "Invoiced", "Not Paid"), (4, "Invoiced", "Paid"), (5, "No Invoice Required", "Paid"), (6, "Active", NULL); SELECT * FROM Demo ORDER BY CASE -- 把Cancelled放到最后一档,分配最高权重 WHEN Status = 'Cancelled' THEN 2 -- 把Invoiced且InvoiceStatus为Paid的放到倒数第二档 WHEN Status = 'Invoiced' AND InvoiceStatus = 'Paid' THEN 1 -- 其他所有记录放在最前面 ELSE 0 END ASC, -- 同一优先级内按JobID升序排列 JobID ASC;
排序逻辑说明
- 通过
CASE给不同规则的记录分配排序权重:数字越小,排序越靠前- 权重0:所有不符合特殊规则的记录(比如Active、Invoiced(Not Paid)、No Invoice Required等),正常排在前面
- 权重1:
Status='Invoiced'且InvoiceStatus='Paid'的记录,排在普通记录之后 - 权重2:
Status='Cancelled'的记录,放在最后
- 先按权重升序排序,再在同一权重组内按
JobID升序排列,完全匹配你的预期输出
执行结果
JobID Status InvoiceStatus ----------------------------------------- 1 Active NULL 3 Invoiced Not Paid 5 No Invoice Required Paid 6 Active NULL 4 Invoiced Paid 2 Cancelled NULL
这种方式比FIELD()更灵活,因为它支持多字段的组合条件判断,能应对更复杂的自定义排序场景。
内容的提问来源于stack exchange,提问作者Ben Holness
相关产品推荐
相关产品推荐

