MySQL5 - 分组查询中取各组的前N名

成绩表格Grade

StudentIdClassScore
1A30
2A60
3A75
4A31
5A25
6B95
7B33
8B57
9B87
10C22
11C17
12C85
12C90
14C66

查询每个班级成绩最高前两名

# 建立table
CREATE TABLE `Grade` (
     `StudentId` int(11) NOT NULL AUTO_INCREMENT,
     `Class` varchar(100) DEFAULT NULL,
     `Score` int(11) DEFAULT NULL,
      PRIMARY KEY (`StudentId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

#插入测试数据
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(1, 'A', 30);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(2, 'A', 60);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(3, 'A', 75);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(4, 'A', 31);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(5, 'A', 25);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(6, 'B', 95);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(7, 'B', 33);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(8, 'B', 57);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(9, 'B', 87);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(10, 'C', 22);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(11, 'C', 17);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(12, 'C', 85);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(13, 'C', 90);
INSERT INTO bdg_go_base.Grade (StudentId, Class, Score) VALUES(14, 'C', 66);

#查询语句
SELECT 
     Grade.*
FROM 
     Grade INNER JOIN 
     (     SELECT 
                 Class, 
                  GROUP_CONCAT(StudentId ORDER BY Score DESC) gStudentId
            FROM 
                  Grade
            GROUP BY Class 
      )  gGrade
      ON 
            Grade.Class = gGrade.Class 
            AND FIND_IN_SET(Grade.StudentId, gGrade.gStudentId) BETWEEN 1 AND 2
ORDER BY
     Grade.Class, Grade.StudentId;

结果

StudentIdClassScore
2A60
3A75
6B95
9B87
12C85
13C90




参考资料
https://stackoverflow.com/a/15585351

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值