以下表为例,需要取每个班级、被选的次数最多的学科,比如1班的有三个选数学的,一个选语文的,那么期望返回的是数学,其他同理。
id | name | class | course |
---|---|---|---|
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 //外层使用分组
返回结果如下
class | course | counts |
---|---|---|
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;
返回结果如下
class | course |
---|---|
1 | 数学 |
2 | 语文 |
3 | 数学 |
关于这个方法,已经有博主写过了,个人觉得很详细了,连接在此:https://blog.csdn.net/MyfishCake/article/details/120175776