mysql 按条件排序:order by 高级用法之case when, if 复杂排序
2024-03-08 14:29 l_v_y_forever 阅读(804) 评论(0) 编辑 收藏 举报转载自:https://blog.csdn.net/weixin_44684303/article/details/124445293
实例1
原始数据顺序
需要的效果:
- 学科按照顺序 语文,数学,英语
- 分数倒序
演示
- 创建表
CREATE TABLE `student_score` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`student_id` bigint(20) DEFAULT NULL COMMENT '学生ID',
`score` decimal(4,1) DEFAULT NULL COMMENT '分数',
`subject` varchar(64) DEFAULT NULL COMMENT '学科',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='学生分数表';
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 加数据
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (1, 1, 50.0, '语文');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (2, 1, 60.0, '数学');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (3, 1, 89.0, '英语');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (4, 2, 20.0, '语文');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (5, 2, 30.0, '数学');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (6, 2, 10.0, '英语');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (7, 3, 90.0, '语文');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (8, 3, 99.0, '数学');
INSERT INTO `student_score`(`id`, `student_id`, `score`, `subject`) VALUES (9, 3, 91.0, '英语');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
使用order by case when语法查询
-- 需求: 1. 语文排最前面,数学排中间,英语排最后
-- 2. 并且按分数降序排列
SELECT * FROM student_score ORDER BY
case
when subject = '语文' then 1
when subject = '数学' then 2
else 3
end
asc, score desc;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
结果:
变形理解
-- 等同如下语句
SELECT *,
case
when subject = "语文" then 1
when subject = "数学" then 2
else 3
end as subject_sort
FROM student_score
ORDER BY subject_sort asc , score desc;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
结果;
使用order by if语句变形,结果一样
SELECT
*
FROM
student_score
ORDER BY
IF(`subject` = '语文',1,
IF( `subject` = '数学', 2, 3 )
),
score DESC
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
案例2
需要的效果:
- subject按照顺序 语文,数学,英语 排
- subject=“语文“时 ,score 升序排
- subject=“数学“时 ,score 倒序排
- subject=“英语“时 ,student_id 升序排
sql如下
SELECT * FROM student_score ORDER BY
case subject
WHEN '语文' THEN 1
WHEN '数学' THEN 2
ELSE 3
end asc,
CASE subject WHEN '语文' THEN score end asc,
CASE subject WHEN '数学' THEN score end desc,
CASE subject WHEN '英语' THEN student_id end asc;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix