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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 19:36:07