如何在子查询中选取最大值?附学生与课程表数据示例
在子查询中选取最大值的实现方法
嘿,我来帮你搞定子查询里取最大值的问题!结合你给出的Student和Class两张表,我先默认你想要的是找出每个班级里最晚报名的学生信息——要是你的实际需求有小调整,也能基于这个思路改哈。
首先先明确你的表结构:
你的表结构
Student表
| 姓名 | 邮箱 |
|---|---|
| Arturo Vidal | arturo.vidal@usm.cl |
| Bastian Quezada | bastian@usm.cl |
| Javier Jeria | javier@usm.cl |
| Sebastian Piñera | sebastian@presidente.cl |
| Sebastian Gallardo | sebastian@usm.cl |
Class表
| classId | 邮箱 | signUpDate |
|---|---|---|
| 1 | sebastian@usm.cl | 2018-01-01 |
| 1 | javier@usm.cl | 2019-10-01 |
| 1 | bastian@usm.cl | 2018-07-01 |
下面给你两种常用的子查询取最大值的实现方式:
方法一:用IN子查询获取每个班级的最大报名日期
这种方法适合大多数数据库,先通过子查询按班级分组,拿到每个班级的最晚报名日期,再关联学生表筛选出对应记录:
SELECT s.姓名, s.邮箱, c.classId, c.signUpDate FROM Student s JOIN Class c ON s.邮箱 = c.邮箱 WHERE (c.classId, c.signUpDate) IN ( SELECT classId, MAX(signUpDate) FROM Class GROUP BY classId );
执行这个查询后,就会返回班级1里最晚报名的Javier Jeria的信息,因为他的报名日期2019-10-01是这个班级里最大的。
方法二:关联子查询(兼容旧版数据库)
如果你的数据库不支持上面的行构造器语法(比如某些旧版本的MySQL),可以用关联子查询的方式,子查询会根据外层当前的班级ID,动态找出该班级的最大报名日期:
SELECT s.姓名, s.邮箱, c.classId, c.signUpDate FROM Student s JOIN Class c ON s.邮箱 = c.邮箱 WHERE c.signUpDate = ( SELECT MAX(signUpDate) FROM Class WHERE classId = c.classId );
这个写法逻辑和第一种一致,只是换了子查询的关联方式,兼容性更好。
小提示:如果同一个班级里有多个学生在最晚报名日期当天报名,这两个查询都会返回所有符合条件的学生;如果你只需要其中一条,可以结合LIMIT或者添加额外筛选条件调整~
内容的提问来源于stack exchange,提问作者M Aubel
相关产品推荐
相关产品推荐

