【MySql】分组topN问题

一、数据

在这里插入图片描述

二、问题

查询各科成绩前两名的记录

三、思路

思路1:手动分组,分别将每门课程的前两名记录查询出来,再将数据拼接。
(select * from score s1 where 课程号=0001 order by 成绩 desc limit 2)
union
(select * from score s1 where 课程号=0002 order by 成绩 desc limit 2)
union
(select * from score s1 where 课程号=0003 order by 成绩 desc limit 2) ;
思路2:使用关联子查询。

表中每条数据都遍历一遍,只要符合:跟它同科目的所有成绩相比(包括自己),排名在前两名,该条数据就应该被显示。
跟它同科目的所有成绩相比(包括自己),排名在前两名可以翻译为:同一科目下的所有记录形成的集合,最多只有一个成绩比它大,另一个就是它本身。count(满足条件的记录)<2

SELECT * 
FROM score (外)
WHERE 该数据在同一课程组下,组中成绩(外)大于本条成绩(内)的记录的条数 <2
SELECT * 
FROM score 
WHERE (select count(*) from score where 外表.课程号=内表.课程号 AND 内表.成绩<外表.成绩) <2

外表.课程号=内表.课程号用于分组
外表.成绩<内表.成绩 用于寻找排名的条件

在这里插入图片描述

SELECT * 
FROM score a
WHERE ( SELECT COUNT( * ) FROM score b WHERE a.课程号 = b.课程号 AND a.成绩 < b.成绩 ) <2
ORDER BY a.课程号, a.成绩 DESC ;#排序便于观察

在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值