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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:30:31