在 MySQL 中要实现条件排序可使用 ORDER BY CASE WHEN
语法, 他的主要功能有:
👉 实现“条件排序” —— 根据不同的条件动态决定排序优先级。
ORDER BY CASE WHEN
的作用是:
为排序字段添加逻辑判断,以便根据记录满足的条件进行分组排序或优先级排序。
ORDER BY
CASE
WHEN 条件1 THEN 排序值1
WHEN 条件2 THEN 排序值2
...
ELSE 默认排序值
END [ASC|DESC]
CASE WHEN ... THEN ...
:根据不同条件返回不同的排序权重ORDER BY
:根据这些返回值排序ASC
(从小到大),你也可以用 DESC
(从大到小)需求:
展示用户表,先展示 VIP 等级大于 5的用户,再展示其他用户; vip等级两个分组中的用户再按活跃度降序排序
SELECT *
FROM users
ORDER BY
CASE
WHEN vip_grade > 5 THEN 0
ELSE 1
END,
activity_score DESC;
解释:
vip_grade > 5
,CASE
返回 0,排前面需求:
订单按状态排:先显示“待付款”,然后“已付款”,最后“已完成”
SELECT *
FROM orders
ORDER BY
CASE status
WHEN 'pending' THEN 0
WHEN 'paid' THEN 1
WHEN 'completed' THEN 2
ELSE 3
END;
需求:
某列为空的数据先过滤,再排序,或放最后
SELECT *
FROM products
ORDER BY
CASE WHEN price IS NULL THEN 1 ELSE 0 END, -- 非空排前
price ASC;
CASE
是在排序阶段运行的,会影响排序性能,尤其不能使用索引排序时。
小数据量 OK;大数据量建议:
WHERE
过滤尽可能缩小结果集LIMIT
)CASE
的逻辑提前转为字段(例如创建 sort_group
字段)方法1:加临时字段优化排序
SELECT *, CASE WHEN people > 5 THEN 0 ELSE 1 END AS sort_group
FROM your_table ORDER BY sort_group, popularity DESC;