mysql之groupby获得分组指定记录
场景及需求
有如下示例表(表名test):
字段编码 | 字段名 |
---|---|
id | id |
学科 | subject |
成绩 | score |
如果只是想要获得每个学科的最高分的话,那么
select subject, score from test group by subject
上述sql能够获得需要的结果
但是更多时候我们想要的不仅仅是这样,我们还想要同时取得学科最高分对应的id,那么我们可以这样写
select id, subject, score from (select * from test order by score) group by subject
原理
group by后获取的第一条记录是默认第一条,那么我们先将其排序之后再去获取的,那么就能够获得到我们想要的那一条记录了
注意事项
如果mysql版本为5.7及以上,那么需要在排序时增加一个limit
select id, subject, score from (select * from test order by score limit 10000) group by subject
但是如果记录大于指定的limit的话,那么就会出现问题,所以这种情况只适用于数据量能够掌控的表。
查了一下之后发现另外一种方法
另一种方法
看了之后发现,这种仅限于你想要取得的字段的限定条件是唯一的情况,并不能够满足我们此种场景下的需求(此场景下的限定条件是最大成绩的那一条,而非最大id的记录)
所以
如果想规避limit的问题,那么就
select subject, score from test group by subject
后再用指定的subject和score去查询出对应的记录吧
select * from test where subject = #{subject} and score = #{score}