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

MySQL如何按ID分组查询每个ID晚于当前日期的最近两条日期数据

解决方案

方式1:MySQL 8.0及以上版本(推荐)

用窗口函数ROW_NUMBER()给同ID下符合日期条件的记录按日期升序排序,取排序值小于等于2的即可:

SELECT eDate, ID
FROM (
    SELECT 
        eDate,
        ID,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY eDate ASC) AS rn
    FROM myTable
    WHERE ID IN (1,3) AND eDate >= CURDATE()
) t
WHERE rn <= 2
ORDER BY ID, eDate;

如果需要保留调试用的eCount字段,直接把rn别名改成eCount即可。

方式2:MySQL 5.x及更低版本(无窗口函数支持)

用关联子查询的方式实现分组取Top N:

SELECT t1.eDate, t1.ID, COUNT(*) AS eCount
FROM myTable t1
INNER JOIN myTable t2 
    ON t1.ID = t2.ID 
    AND t2.eDate >= CURDATE() 
    AND t2.eDate <= t1.eDate
WHERE t1.ID IN (1,3) AND t1.eDate >= CURDATE()
GROUP BY t1.ID, t1.eDate
HAVING COUNT(*) <= 2
ORDER BY t1.ID, t1.eDate;

你之前的写法出错的核心原因是:GROUP BY ID,eDate会把每个ID+日期的组合单独作为一组,每组的COUNT统计值天然都是1,所以HAVING条件过滤不掉任何符合日期要求的记录,最终会返回全部匹配结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:48:00