You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:42:36