如何查询学生所选全部科目的最新考试记录?
解决方案:单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;
逻辑说明
- 内层子查询:给Joe的所有考试记录按
subject分组,每组内按exam_datetime倒序排序,生成排名rn——每组里最新的记录排名为1。 - 外层查询:筛选出排名
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
相关产品推荐
相关产品推荐

