MySQL LEFT JOIN关联查询如何仅返回每个学生的最新请假日期
解决方案
首先明确前提:默认请假表table_2包含用于关联学生的student_id字段(否则无法匹配学生对应的请假记录),可通过以下两种方案实现需求:
方案1:预聚合请假表后关联(兼容所有MySQL版本)
先对table_2按学生ID分组,计算每个学生的最晚请假日期,再将聚合后的结果和学生基础表左关联即可,每个学生只会返回一条记录:
SELECT t1.student_name, t1.student_id, t1.note, t2.last_leave_date FROM table_1 t1 LEFT JOIN ( SELECT student_id, MAX(`leave`) AS last_leave_date FROM table_2 GROUP BY student_id ) t2 ON t1.student_id = t2.student_id;
leave是MySQL关键字,查询时需要用反引号包裹避免语法报错- 没有请假记录的学生
last_leave_date字段会返回NULL,如果需要自定义默认值可以用IFNULL(t2.last_leave_date, '无请假记录')替换对应字段
方案2:窗口函数实现(仅支持MySQL 8.0及以上版本)
如果除了最晚请假日期还需要同时获取该条请假记录的其他字段(比如请假原因、请假天数等),可以用窗口函数实现:
SELECT t1.student_name, t1.student_id, t1.note, t2.`leave` AS last_leave_date, -- 可在此处追加需要的请假表其他字段 t2.id AS leave_record_id FROM table_1 t1 LEFT JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY `leave` DESC) AS rn FROM table_2 ) t2 ON t1.student_id = t2.student_id AND t2.rn = 1;
PARTITION BY student_id按学生分组,ORDER BY leave DESC按请假日期倒序排序,取每组的第一条rn=1就是该学生最晚的请假记录
内容的提问来源于stack exchange,提问作者Sourav R S
相关产品推荐
相关产品推荐

