博客
关于我
MySQL获取分组后的TOP 1和TOP N记录
阅读量:789 次
发布时间:2023-02-13

本文共 1726 字,大约阅读时间需要 5 分钟。

MySQL窗口函数缺失解决方案

在MySQL中,由于缺少窗口函数(如RANK、DENSE_RANK等),某些常见需求需要通过其他方法来实现。以下将详细介绍如何解决以下两种常见需求:

1. 查询每门课程成绩最高的学生及成绩

方法一:自连接

推荐使用自连接的方法,通过将结果集与自身连接,筛选出成绩最高的学生。

select a.name, a.course, a.scorefrom test1 ajoin test1 b on a.course = b.course and a.score = b.scorewhere b.score = (select max(score) from test1 where course = a.course);

方法二:相关子查询

通过在主查询中使用相关子查询,直接筛选出成绩最高的记录。

select name, course, scorefrom test1 awhere score = (select max(score) from test1 where a.course = test1.course);

方法三:排除低于最高分的记录

另一种方法是利用NOT EXISTS子查询,排除低于最高分的记录。

select name, course, scorefrom test1 awhere not exists(    select 1 from test1    where a.course = test1.course and a.score < test1.score);

2. 查询每门课程前两名的学生及成绩(N>=1)

方法一:UNION ALL

通过将每门课程的前两名成绩合并,使用UNION ALL操作。

(select name, course, scorefrom test1where course = '语文' order by score desc limit 2)union all (select name, course, scorefrom test1where course = '数学' order by score desc limit 2)union all (select name, course, scorefrom test1where course = '英语' order by score desc limit 2);

方法二:自身左连接

通过左连接自身表,筛选出每门课程前两名的学生。

select a.name, a.course, a.scorefrom test1 aleft join test1 b on a.course = b.course and a.score = b.scoregroup by a.name, a.course, a.scorehaving count(b.id) < 2order by a.course, a.score desc;

方法三:相关子查询

通过子查询筛选出每门课程前两名的学生。

select *from test1 awhere 2 > (select count(*) from test1 where course = a.course and score > a.score)order by a.course, a.score desc;

方法四:使用用户变量

通过设置用户变量,逐步筛选出前两名的学生。

set @num := 0, @course := '';select name, course, scorefrom test1where (    @num := if(@course = course, @num + 1, 1) as row_number,    @course := course as dummy    from test1    order by course, score desc) as xwhere x.row_number <= 2;

这些方法均可在MySQL中实现分组后获取最值及前N名记录的需求,适用于窗口函数缺失的情况。

转载地址:http://todfk.baihongyu.com/

你可能感兴趣的文章
MySql的创建数据表、约束、外键约束的创建修改删除、级联操作
查看>>
MySQL的删除修改的实验目的_基础篇 - 数据库及表的修改和删除
查看>>
MySQL的四大隔离级别,你都知道哪些?
查看>>
MySQL的四种事务隔离级别
查看>>
MySQL的基本命令
查看>>
Mysql的备份与恢复类型
查看>>
mysql的大小写对性能的影响问题
查看>>
mysql的密码管理、mysql初始密码查找、密码修改、mysql登录
查看>>
mysql的常见八股文面试题
查看>>
MySQL的常见命令
查看>>
mysql的引擎以及优缺点_MySQL有哪些存储引擎,各自的优缺点,应用场景-阿里云开发者社区...
查看>>
MySQL的操作:
查看>>
mysql的数据类型有哪些?
查看>>
MYSQL的最左匹配原则的原理讲解
查看>>
mysql的语法规范
查看>>
MySql的连接查询
查看>>
mysql的配置文件参数
查看>>
MySQL的错误:No query specified
查看>>
mysql监控工具-PMM,让你更上一层楼(上)
查看>>
mysql监控工具-PMM,让你更上一层楼(下)
查看>>