1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > mysql实现分组查询每个班级的前三名 每门课程的前三名

mysql实现分组查询每个班级的前三名 每门课程的前三名

时间:2021-08-31 17:53:31

相关推荐

mysql实现分组查询每个班级的前三名 每门课程的前三名

1、 创建表

drop table student;create table student(id varchar(20),-- 编号class varchar(20),-- 年级score int-- 分数);

2、插入数据

delete from student;insert student values('1','一年级',82);insert student values('2','一年级',95);insert student values('3','一年级',82);insert student values('4','一年级',40);insert student values('5','一年级',20);insert student values('6','二年级',95);insert student values('7','二年级',40);insert student values('8','二年级',3);insert student values('9','二年级',60);insert student values('10','二年级',10);insert student values('11','三年级',70);insert student values('12','三年级',60);insert student values('13','三年级',40);insert student values('14','三年级',90);insert student values('15','三年级',20);

3、第一种方法

如果多人并列第一或者第二,全部可以查出来

SELECT*FROMstudent aWHERE( SELECT count(*) FROM student b WHERE b.class = a.class AND a.score < b.score )< 3ORDER BYa.class,a.score DESC;

注意如果查前2名,第二名的有两个,有并列

SELECT*FROMstudent aWHERE( SELECT count(*) FROM student b WHERE b.class = a.class AND a.score < b.score )< 2ORDER BYa.class,a.score DESC;

4、第二种方法

SELECTa.*,COUNT( a.id )FROMstudent a,student bWHEREb.class = a.classAND a.score <= b.scoreGROUP BYa.id,a.class,a.scoreHAVINGCOUNT( a.id )<4ORDER BYa.class,a.score DESC;

如果查前两名则无法查询出分数为82 的,无法查询出并列的

SELECTa.*,COUNT( a.id )FROMstudent a,student bWHEREb.class = a.classAND a.score <= b.scoreGROUP BYa.id,a.class,a.scoreHAVINGCOUNT( a.id )<3ORDER BYa.class,a.score DESC;

5、第三种方法

结果同第一种方法,不再演示结果

SELECTa.*,COUNT( a.id )FROMstudent aLEFT JOIN student b ON b.class = a.classWHEREa.score >= b.scoreGROUP BYa.id,a.class,a.scoreHAVINGCOUNT( a.id )>3ORDER BYa.class,a.score DESC;

其中>3 这里,判断首先根据sql (去掉HAVINGCOUNT( a.id )>3)后,选择COUNT( a.id )>3最大的三个数字,找到第四大的后,大于该数字即可

6、每门科目的前三名

其实类似该种方法,不在赘述

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。