MySQL分组排序
前言
业务场景:student_score是学生的分数表,其中包含id、学生、科目、创建时间、分数字段,现在我们需要进行平均分、最大分数、最小分数等不同纬度的统计。
运行环境:
MySQL8.0
Java8
一、前期准备
建表语句:
CREATE TABLE `student_score` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`student` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学生姓名',
`project` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '科目',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`score` int DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `student` (`student`,`project`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
数据准备:
随机生成姓名,依次插入模拟数据
自动生成项目地址
二、统计
1.平均分
select group_concat(distinct student), avg(score) from student_score group by student
2.计算个人最低分
select group_concat(distinct student), min(score) from student_score group by student
3.计算个人最高分
select group_concat(distinct student), max(score) from student_score group by student
总结
① 巧妙利用mysql的max、min函数
② 计算所有同学的学科最高分,网上流传最多的是下面的写法:
select * from (select * from student_score order by score desc limit 1000) a group by a.student
这样写有个弊端,limit限制了结果集的数据量,对以后的业务扩展都会有影响
另外:max和min也有弊端,如图project字段并不是该条数据的正确科目(分数与科目不对应):