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

MySQL如何按userId分组查询每个用户对应最新日期的日志记录

需求实现说明

该需求完全可以通过单条SQL语句实现。你原有语句仅对符合条件的日志做了时间倒序排序,会返回所有userId在(1,2)范围内的日志,没有按用户分组过滤出每组最新的一条记录,因此无法得到预期结果。

以下提供两种常用实现方案:

方案1:全数据库兼容写法(适配所有主流关系型数据库)

通过子查询先拿到每个目标用户的最大日志时间,再关联回原日志表取对应整行记录,兼容MySQL5.x、Oracle、SQL Server等所有主流数据库:

SELECT l.id, l.userId, l.message, l.date
FROM logs l
INNER JOIN (
    -- 先查询每个目标用户的最大日志时间
    SELECT userId, MAX(date) AS max_date
    FROM logs
    WHERE userId IN (1,2)
    GROUP BY userId
) t ON l.userId = t.userId AND l.date = t.max_date
WHERE l.userId IN (1,2);

方案2:窗口函数写法(适配支持窗口函数的数据库,如MySQL8.0+、PostgreSQL、SQL Server 2008+等)

使用ROW_NUMBER窗口函数按用户分组、按时间倒序排名,取每组排名第一的记录即可,还可灵活处理同用户同时间多条日志的场景:

SELECT id, userId, message, date
FROM (
    SELECT 
        *,
        -- 按用户分组,日志时间倒序排名
        ROW_NUMBER() OVER (PARTITION BY userId ORDER BY date DESC) AS rn
    FROM logs
    WHERE userId IN (1,2)
) t
WHERE rn = 1;

如果需要返回同一个用户最大时间对应的所有日志,把ROW_NUMBER替换为RANK即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:45:02