如何用单条MySQL查询获取我不是最后评论者的博客文章?
解决方案:查询非最后评论者的博客文章
针对你的需求,利用MySQL 8支持的窗口函数可以优雅地解决问题,以下是完整的SQL查询:
SELECT DISTINCT p.* FROM posts p LEFT JOIN ( SELECT post_id, user_id, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY created_at DESC) AS rn FROM comments ) c ON p.id = c.post_id WHERE c.rn IS NULL OR c.user_id != YOUR_USER_ID;
代码说明:
- 子查询逻辑:使用
ROW_NUMBER()窗口函数,按post_id分组后对评论按创建时间倒序排序,每组中最新的评论会被标记为rn = 1。 - 关联查询:通过
LEFT JOIN关联文章表和子查询,确保没有任何评论的文章也被纳入结果(这类文章你自然不是最后评论者)。 - 筛选条件:
c.rn IS NULL:匹配无评论的文章c.user_id != YOUR_USER_ID:匹配有评论但最新评论者不是你的文章
- 去重处理:
DISTINCT用来避免同一文章因多条评论产生重复记录。
如果只需要筛选有评论但你不是最后评论者的文章,可修改为:
SELECT DISTINCT p.* FROM posts p INNER JOIN ( SELECT post_id, user_id, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY created_at DESC) AS rn FROM comments ) c ON p.id = c.post_id WHERE c.rn = 1 AND c.user_id != YOUR_USER_ID;
对你之前尝试的修正:
- 单篇文章最新评论查询:
ORDER BY应放在WHERE之后,正确写法:
SELECT * FROM comments WHERE post_id = 1 ORDER BY created_at DESC LIMIT 1;
- 分组查询问题:在
sql_mode=only_full_group_by模式下,SELECT列必须属于GROUP BY或为聚合函数,你的原语句不符合规则。而且即使关闭该模式,MAX(created_at)无法关联到对应的user_id,会导致结果错误,窗口函数是更可靠的替代方案。
内容的提问来源于stack exchange,提问作者SPRTK
相关产品推荐
相关产品推荐

