MySQL查询咨询:获取指定日期前的id及符合条件的StudentId
解决MySQL查询:获取最后一次借书早于指定日期的学生ID
先明确需求:我们要从book_history表中找出所有**最后一次借书记录的日期早于'2017-12-31'**的StudentId。这里的关键是先定位每个学生的最晚借书日期,再做筛选。
我给你两种可行的方案,你可以根据自己的MySQL版本和需求选择:
方案1:使用GROUP BY + HAVING(适用于所有MySQL版本)
这是最经典的分组聚合方法,直接计算每个学生的最晚借书日期并筛选:
SELECT StudentId FROM book_history GROUP BY StudentId HAVING MAX(RecordCreatdOn) < '2017-12-31';
逻辑解释:
GROUP BY StudentId:将所有借书记录按学生ID分组,每个组对应一个学生的所有借书记录MAX(RecordCreatdOn):计算每个学生组内的最晚借书日期HAVING子句:筛选出最晚借书日期早于'2017-12-31'的学生组,最终得到符合条件的StudentId
方案2:使用窗口函数(MySQL 8.0及以上版本支持)
如果你的MySQL版本是8.0或更高,窗口函数会让逻辑更直观,能清晰定位到每个学生的最后一条借书记录:
WITH student_last_borrow AS ( SELECT StudentId, RecordCreatdOn, -- 按学生分组,按借书日期倒序编号,最新记录编号为1 ROW_NUMBER() OVER (PARTITION BY StudentId ORDER BY RecordCreatdOn DESC) AS rn FROM book_history ) SELECT StudentId FROM student_last_borrow WHERE rn = 1 AND RecordCreatdOn < '2017-12-31';
逻辑解释:
- 先用CTE(临时结果集)
student_last_borrow给每个学生的记录按借书日期倒序编号,最新的那条记录编号为1 - 然后从这个临时结果集中筛选出编号为
1(即最后一次借书)且日期早于'2017-12-31'的StudentId
注意事项:
- 确保
RecordCreatdOn字段的类型是DATE或DATETIME,否则日期比较可能出现异常 - 由于
book_history只有借书时才会插入记录,所以不会出现无借书记录的学生,无需额外处理空值情况
内容的提问来源于stack exchange,提问作者Lin toka
相关产品推荐
相关产品推荐

