SQL查询:如何获取除每个用户最新发帖外的所有活跃用户记录
问题分析
原SQL存在两类问题:
- 拼写错误:
LEFT JOIN deb_user y应为LEFT JOIN db_user y,x.date应为x.udate - 核心逻辑错误:排除条件仅判断发帖日期是否属于所有用户的最大发帖日期集合,没有绑定用户ID,导致不同用户同日期的发帖被误排除。
修正方案
方案1:使用窗口函数(兼容MySQL 8.0+、PostgreSQL、SQL Server等主流新版数据库)
性能和可读性最优,推荐优先使用:
SELECT y.name, t.user_id, t.udate FROM ( SELECT user_id, udate, -- 按用户分组,发帖日期倒序排序,最新的排在第1位 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY udate DESC) AS rn FROM db_post ) t -- 关联用户表过滤活跃用户 INNER JOIN db_user y ON t.user_id = y.id WHERE y.is_active = 1 -- 排除每个用户排序第1的最新发帖 AND t.rn > 1 ORDER BY t.user_id, t.udate;
如果需要把用户同一天的多条最新发帖全部排除,把ROW_NUMBER()替换为RANK()即可。
方案2:关联子查询版本(兼容不支持窗口函数的老版本数据库)
适配MySQL 5.x等不支持窗口函数的场景:
SELECT y.name, x.user_id, x.udate FROM db_post x INNER JOIN db_user y ON x.user_id = y.id LEFT JOIN ( -- 先查询每个用户的最新发帖日期 SELECT user_id, MAX(udate) AS max_udate FROM db_post GROUP BY user_id ) t ON x.user_id = t.user_id WHERE y.is_active = 1 -- 仅排除当前用户自己的最新日期发帖 AND x.udate < t.max_udate ORDER BY x.user_id, x.udate;
如果用户仅有1条发帖,会自动被过滤,符合需求。
内容的提问来源于stack exchange,提问作者Boby
相关产品推荐
相关产品推荐

