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

如何用单条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;

代码说明:

  1. 子查询逻辑:使用ROW_NUMBER()窗口函数,按post_id分组后对评论按创建时间倒序排序,每组中最新的评论会被标记为rn = 1。
  2. 关联查询:通过LEFT JOIN关联文章表和子查询,确保没有任何评论的文章也被纳入结果(这类文章你自然不是最后评论者)。
  3. 筛选条件:
    • c.rn IS NULL:匹配无评论的文章
    • c.user_id != YOUR_USER_ID:匹配有评论但最新评论者不是你的文章
  4. 去重处理: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;

对你之前尝试的修正:

  1. 单篇文章最新评论查询:ORDER BY应放在WHERE之后,正确写法:
SELECT *
FROM comments
WHERE post_id = 1
ORDER BY created_at DESC
LIMIT 1;
  1. 分组查询问题:在sql_mode=only_full_group_by模式下,SELECT列必须属于GROUP BY或为聚合函数,你的原语句不符合规则。而且即使关闭该模式,MAX(created_at)无法关联到对应的user_id,会导致结果错误,窗口函数是更可靠的替代方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:12