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

如何查询学生所选全部科目的最新考试记录?

解决方案:单SQL查询获取学生所有科目最新考试记录

不推荐你提到的“先查科目再逐个查询”的方案——这种方式需要多次发起数据库请求,不仅代码繁琐,数据量较大时性能也会很差。用窗口函数可以一次性完成查询,这是更高效的实现方式。

假设你的考试提交表结构大致如下(可根据实际表名/字段调整):

CREATE TABLE exam_submissions (
    student_name VARCHAR(100),
    subject VARCHAR(100),
    exam_datetime DATETIME,
    exam_score INT,
    submission_id INT PRIMARY KEY AUTO_INCREMENT
);

核心查询语句

针对学生'Joe Bloggs',用ROW_NUMBER()窗口函数按科目分组,给每个科目的考试记录按时间倒序排名,取排名为1的记录(即最新那条):

SELECT student_name, subject, exam_datetime, exam_score, submission_id
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY subject ORDER BY exam_datetime DESC) AS rn
    FROM exam_submissions
    WHERE student_name = 'Joe Bloggs'
) ranked_submissions
WHERE rn = 1;

逻辑说明

  1. 内层子查询:给Joe的所有考试记录按subject分组,每组内按exam_datetime倒序排序,生成排名rn——每组里最新的记录排名为1。
  2. 外层查询:筛选出排名rn=1的记录,就是每个科目对应的最新考试。

替代方案(无窗口函数时适用)

如果你的数据库不支持窗口函数(比如老版本MySQL),可以用关联查询实现:

SELECT es1.*
FROM exam_submissions es1
JOIN (
    SELECT subject, MAX(exam_datetime) AS latest_datetime
    FROM exam_submissions
    WHERE student_name = 'Joe Bloggs'
    GROUP BY subject
) es2 ON es1.subject = es2.subject 
    AND es1.exam_datetime = es2.latest_datetime
    AND es1.student_name = 'Joe Bloggs';

注意:如果同一科目同一时间有多个提交,这个方案会返回所有同时间的记录;若需唯一一条,可再加MAX(submission_id)这类条件确定唯一记录。

为什么比逐个查询好?

  • 仅需一次数据库请求,减少网络开销和数据库连接消耗
  • 利用数据库聚合/窗口函数优化,性能远高于多次零散查询
  • 代码更简洁,便于维护和扩展

内容的提问来源于stack exchange,提问作者frimann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:32:03