Mysql 分组查询top n(多种方法)

Mysql 分组查询top n(多种方法),第1张

查询每门科目的前3名。

对于查询的结果,一般有两种情况

表所有数据为:

情况1:对于分数相同的人,其后面的人 紧跟着名次排,直到排够名次3,就不再往后取了。

情况2:对于分数相同的人,若当前相同名次的人数大于或等于 3, 则相同分数其后面的人不再参于top3了。

在情况2中 ,为什么”李四 - java“ 这行没有了呢?

可以这样理解,在情况2中相当于使用了 名次空缺 , 分数相同的人其后面那个人,的名次为 前面的人数+1 , 这里的 ”李四-java“这行,他的名次应当是 5 , 所有top3自然取不到 ”李四-java“这行。

情况2和情况 写法都是对应的, 需要注意的是 并列名次,后面的人 是否需要保持名次空缺。那么统计的时候就需要根据情况去重。

参考链接:

https://blog.csdn.net/weixin_44497013/article/details/107317719

https://leetcode-cn.com/problems/department-top-three-salaries/solution/mysqlzi-ding-yi-bian-liang-shi-xian-fen-lei-pai-xu/

本文实例讲述了mysql使用GROUP

BY分组实现取前N条记录的方法。分享给大家供大家参考,具体如下:

MySQL中GROUP

BY分组取前N条记录实现

mysql分组,取记录

GROUP

BY之后如何取每组的前两位下面我来讲述mysql中GROUP

BY分组取前N条记录实现方法。

这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~):

结果:

方法一:

复制代码

代码如下:SELECT

a.id,a.SName,a.ClsNo,a.Score

FROM

aa

a

LEFT

JOIN

aa

b

ON

a.ClsNo=b.ClsNo

AND

a.Score<b.Score

group

by

a.id,a.SName,a.ClsNo,a.Score

having

count(b.id)<2

ORDER

BY

a.ClsNo,a.Score

desc

拆开分析:

<!--[if

!supportLists]-->1、

<!--[endif]-->LEFT

JOIN

aa

b

ON

a.ClsNo=b.ClsNo

AND

a.Score<b.Score

同一个班级(每个班级四个人),分数比当前学生高的记录,那就意味这成绩垫底的学生,将会产生三条记录

<!--[if

!supportLists]-->2、

<!--[endif]-->group

by

a.id,a.SName,a.ClsNo,a.Score

having

count(b.id)<2

a.id,a.SName,a.ClsNo,a.Score可以代表一个学生(以学生分组),如果count(b.id)<2(成绩超过你的人不能多于2个),那就只剩第一第二了。

方法二:

复制代码

代码如下:SELECT

*

FROM

aa

a

WHERE

2>(SELECT

COUNT(*)

FROM

aa

WHERE

ClsNo=a.ClsNo

and

Score>a.Score)

ORDER

BY

a.ClsNo,a.Score

DESC

这个我觉得是比较有意思的,取每一条记录,判断同一个班级,大于当前成绩的同学是不是小于2个人。

方法三:

复制代码

代码如下:SELECT

*

FROM

aa

WHERE

id

IN

(SELECT

id

FROM

aa

WHERE

ClsNo=a.ClsNo

ORDER

BY

Score

DESC

LIMIT

2)

ORDER

BY

a.ClsNo,a.Score

DESC

这种方式进过测试不通过,ERROR

1235

(42000):

This

version

of

MySQL

doesn't

yet

support

'LIMIT

&

IN/ALL/ANY/SOME

subquery'

,不能在这几个子查询中使用limit。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL日志 *** 作技巧大全》、《MySQL事务 *** 作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

希望本文所述对大家MySQL数据库计有所帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7255573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存