mysql分组取topN的三种方式

目录:

一、需求

二、建表语句插入数据

三、表内容展示

四、结果展示

五、三种mySQL查询的方式


一、需求

有表 如下,要求取出各班前两名(允许并列)

二、建表语句插入数据

CREATE TABLE topn_yh(
     id int not null primary key,
    SName VARCHAR(20),
	ClsNo VARCHAR(20),
	Score VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO topn_yh(id , SName,ClsNo,Score) values (1,'AAAA','C1','67');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (2,'BBBB','C1','55');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (3,'CCCC','C1','67');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (4,'DDDD','C1','65');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (5,'EEEE','C1','95');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (6,'FFFF','C2','57');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (7,'GGGG','C2','87');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (8,'HHHH','C2','74');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (9,'IIII','C2','52');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (10,'JJJJ','C2','81');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (11,'KKKK','C2','67');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (12,'LLLL','C2','66');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (13,'MMMM','C2','63');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (14,'NNNN','C3','99');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (15,'OOOO','C3','50');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (16,'PPPP','C3','59');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (17,'QQQQ','C3','66');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (18,'RRRR','C3','76');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (19,'SSSS','C3','50');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (20,'TTTT','C3','50');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (21,'UUUU','C3','64');
INSERT INTO topn_yh(id , SName,ClsNo,Score) values (22,'VVVV','C3','74');

三、表内容展示

id SName ClsNo Score
1 AAAA C1 67
2 BBBB C1 55
3 CCCC C1 67
4 DDDD C1 65
5 EEEE C1 95
6 FFFF C2 57
7 GGGG C2 87
8 HHHH C2 74
9 IIII C2 52
10 JJJJ C2 81
11 KKKK C2 67
12 LLLL C2 66
13 MMMM C2 63
14 NNNN C3 99
15 OOOO C3 50
16 PPPP C3 59
17 QQQQ C3 66
18 RRRR C3 76
19 SSSS C3 50
20 TTTT C3 50
21 UUUU C3 64
22 VVVV C3 74

四、结果展示

id SName ClsNo Score
5 EEEE C1 95
1 AAAA C1 67
3 CCCC C1 67
7 GGGG C2 87
10 JJJJ C2 81
14 NNNN C3 99
18 RRRR C3 76

在这里插入图片描述

五、三种mySQL查询的方式

方法一:

select a.id,a.SName,a.ClsNo,a.Score
from topn_yh a left join topn_yh 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

方法二:

select *
from topn_yh a
where 2>(select count(*) from topn_yh where ClsNo=a.ClsNo and Score>a.Score)
order by a.ClsNo,a.Score desc

方法三:

select *
from topn_yh a
where id in (select id from topn_yh where ClsNo=a.ClsNo order by Score desc limit 2)
order by a.ClsNo,a.Score desc
发布了422 篇原创文章 · 获赞 357 · 访问量 124万+

猜你喜欢

转载自blog.csdn.net/silentwolfyh/article/details/103468972
今日推荐