You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:01