mysql group by后查询每组第n条记录和每组前n条记录(Top n问题)

这篇博客探讨了在SQL面试中遇到的复杂问题,如何查询每个班级成绩最高的、第二的以及总分前三的学生。通过举例说明,解释了在没有内置函数支持分组后取第n条或前n条记录的情况下,可以使用子查询、连接等方法实现。文章详细展示了不同方法的SQL查询语句及其执行结果。
摘要由CSDN通过智能技术生成

最近看了关于SQL相关的面试题,对于我这种2年没写复杂SQL语句的渣渣来说实在有点脑阔疼,题目内容大概为:

  1. 查询每个班级成绩最高的学生及其成绩
  2. 查询每个班级成绩第二的学生及其成绩
  3. 查询每个班级总分前三的学生

第一个查询一看就比较简单,难就难在第2和3个查询,因为分组后没有取第n或前n条数据的函数

由于是面试题,没有表结构,所以就随意脑补了一下建表代码:

CREATE TABLE `t_user_score` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(16) DEFAULT NULL,
  `course_name` varchar(32) DEFAULT NULL,
  `score` double DEFAULT NULL,
  `class_name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

为了练习查询往表中插入如下数据:

INSERT INTO `t_user_score` VALUES ('1', '张三', '数学', '34', 'a');
INSERT INTO `t_user_score` VALUES ('2', '张三', '语文', '58', 'a');
INSERT INTO `t_user_score` VALUES ('3', '张三', '英语', '58', 'a');
INSERT INTO `t_user_score` VALUES ('4', '李四', '数学', '45', 'a');
INSERT INTO `t_user_score` VALUES ('5'
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值