Mysql 5.7 取分组第一条

本文探讨了在启用ONLY_FULL_GROUP_BY限制的服务器环境下,如何高效地找出每个班级中被选次数最多的学科。首先介绍了limit+groupby方法,然后转向group_concat+substring_index的解决方案,以适应公司技术限制。两种方法对比并提供优化建议。
摘要由CSDN通过智能技术生成

以下表为例,需要取每个班级、被选的次数最多的学科,比如1班的有三个选数学的,一个选语文的,那么期望返回的是数学,其他同理。

idnameclasscourse
1张三1数学
2李四1数学
3王五1数学
4赵六1语文
5黑七2语文
6猪八2语文
7琴九2数学
8王十3数学
9毛十一3数学
10萧十二3数学
11阿十三3语文

第一种方法: limit + group by

SELECT t.* 
FROM
	( 
		SELECT ta.class,ta.course,count(*) as counts
		FROM courses as ta 
		group by ta.class,ta.course
		order by counts desc // 在这里排序
		LIMIT 1000 //这里是必须的,而且好像最大值是1万
	) t 
GROUP BY t.class //外层使用分组

返回结果如下

classcoursecounts
1数学3
2语文2
3数学3

在站内找了几篇博文,基本都是这个套路,也许这种方法性能会好一些,而且好像可以直接取到最大值那一整行的数据,可以说非常方便了。
比如这篇博文还对优化进行了分析:https://blog.csdn.net/u013066244/article/details/116461584
但是:由于公司服务器启用了ONLY_FULL_GROUP_BY,所以没法使用。

第二种方法:group_concat+substring_index

select tb.class,SUBSTRING_INDEX(GROUP_CONCAT(tb.course order by counts desc),',',1) as course
from 
	(
		SELECT ta.class,ta.course,count(*) as counts
		FROM courses as ta 
		group by ta.class,ta.course
	) as tb 
group by tb.class;

返回结果如下

classcourse
1数学
2语文
3数学

关于这个方法,已经有博主写过了,个人觉得很详细了,连接在此:https://blog.csdn.net/MyfishCake/article/details/120175776

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水晶心泉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值