需求:对MySQL所有记录分组,取组内某字段的最大/最小值
解决办法:
1.先排序再分组取排序后的第一条记录(适用于有重复记录的)
环境准备:mysql5.7
背景:求每个class分类下的年龄最大的学生
数据准备:
id | name | age | class |
---|---|---|---|
1 张三 15 1
2 李四 16 1
3 王五 16 2
4 赵六 15 2
5 钱七 14 2
6 孙八 16 2
7 李九 15 1
8 周十 16 1
在Mysql中,通过GroupBy分组后,会取主键ID最小的一条数据作为分组后的数据。如果存在需求,根据其他字段排序后取对应字段最大或者最小值的话,通过SQL语句是可以实现的,核心在于排序后需要加Limit xx。如果不加Limit xx,则每个分组的数据会默认选择id最小的那条记录。
区别如下:
select * from
(select * from student2 ORDER BY age desc limit 1000) record
GROUP BY record.class;
select * from
(select * from student2 ORDER BY age desc) record
GROUP BY record.class;
思路:
1.先排序
2.再分组取排序的第一条记录
2.通过max(), min()可以实现先排序后分组的功能(适用于没有重复记录的)
背景:求不同type类型的最近一次时间操作的记录
数据准备:
id name type create_time
1 记录一 1 2022-07-31 14:17:42
2 记录二 2 2022-07-31 14:18:02
3 记录三 1 2022-07-31 14:18:16
4 记录四 2 2022-07-31 14:18:27
5 记录五 1 2022-07-31 14:18:48
select * from record a right join
(select type as b_type,max(create_time) as max_create_time from record GROUP BY type) b
on a.type = b.b_type and a.create_time = b.max_create_time
思路;
1.先用max来找出时间最大
2.然后用right join 关联主表, 找出全量信息