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
相关产品推荐
相关产品推荐

