MySQL多表查询问题:如何获取学生最新成绩记录?
嘿,这个问题我之前也碰到过,刚好可以给你几个实用的解决方案!要获取每个学生的最新成绩记录,咱们可以用两种常见的SQL写法,根据你的数据库版本选就行:
方法1:用窗口函数(推荐,高效直观)
这是现在大多数现代数据库(比如MySQL 8.0+、PostgreSQL、SQL Server等)都支持的方式,逻辑清晰,性能也不错:
SELECT s.STU_ID, s.EMAIL, s.NAME, sc.DATE, sc.SCORE FROM TABLE_students s LEFT JOIN ( SELECT STU_ID, DATE, SCORE, -- 按学生分组,日期倒序排,最新的记录标记为1 ROW_NUMBER() OVER (PARTITION BY STU_ID ORDER BY DATE DESC) AS rn FROM TABLE_scores ) sc ON s.STU_ID = sc.STU_ID AND sc.rn = 1;
说明:
- 子查询里的
ROW_NUMBER()会给每个学生的成绩按日期从新到旧编号,最新的那条就是rn=1; - 用
LEFT JOIN是为了保留没有成绩的学生(比如你的例子里Bob和Tim),如果只需要有成绩的学生,改成INNER JOIN就行; - 如果某个学生同一天有多个成绩,
ROW_NUMBER()会随机选一条,要是想保留同一天的所有成绩,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行。
方法2:关联子查询(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用这种写法:
SELECT s.STU_ID, s.EMAIL, s.NAME, sc.DATE, sc.SCORE FROM TABLE_students s LEFT JOIN TABLE_scores sc ON s.STU_ID = sc.STU_ID WHERE -- 匹配当前学生的最新成绩日期 sc.DATE = (SELECT MAX(DATE) FROM TABLE_scores WHERE STU_ID = sc.STU_ID) -- 保留没有成绩的学生(不需要的话可以删掉这行) OR sc.STU_ID IS NULL;
说明:
- 子查询
SELECT MAX(DATE)...会找出每个学生的最新考试日期,然后关联到对应的成绩记录; - 同样,
OR sc.STU_ID IS NULL是为了显示没有成绩的学生,不需要就去掉。
你可以根据自己的需求选其中一种,测试一下应该就能得到想要的结果啦!
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

