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

MySQL技术问询:关联posts与comments表获取用户最新评论

嘿,作为刚接触SQL的新手,能搞定posts和comments表的关联已经迈出一大步啦!针对你要获取所有唯一用户及其对应最新评论的需求,我给你两种在MySQL里非常实用的实现方案,你可以根据自己的MySQL版本来选:

方案一:子查询筛选最新评论(兼容所有MySQL版本)

这种方法不依赖新特性,哪怕你用的是MySQL 5.x版本也能跑通。核心思路是先找出每个用户的最新评论时间,再通过这个时间去匹配对应的评论记录:

SELECT 
    c.user_id,  -- 替换成你表中实际的用户ID字段名
    c.content,  -- 评论内容字段
    c.created_at,  -- 评论创建时间字段
    p.title  -- 如果需要关联posts表的标题等信息,可添加
FROM 
    (SELECT user_id, MAX(created_at) AS latest_comment_time
     FROM comments
     GROUP BY user_id) AS latest
JOIN 
    comments c ON c.user_id = latest.user_id AND c.created_at = latest.latest_comment_time
-- 如果你需要关联posts表,保留下面这行,否则删掉
JOIN posts p ON c.post_id = p.post_id
ORDER BY 
    c.created_at DESC;

小提示:如果同一个用户在同一时间发布了多条评论,这个查询会返回所有这些评论。如果要确保每个用户只返回一条,可以把子查询里的MAX(created_at)换成MAX(comment_id)(前提是comment_id是自增主键,最新的评论ID最大)。

方案二:使用ROW_NUMBER()窗口函数(MySQL 8.0及以上版本推荐)

MySQL 8.0及以后支持窗口函数,写法更简洁直观,能精准控制每个用户只返回一条最新评论:

SELECT 
    user_id,
    content,
    created_at,
    title  -- 关联posts表的字段,按需添加
FROM (
    SELECT 
        c.user_id,
        c.content,
        c.created_at,
        p.title,
        -- 按用户分组,每组内按评论时间倒序编号,最新的评论编号为1
        ROW_NUMBER() OVER (PARTITION BY c.user_id ORDER BY c.created_at DESC) AS rn
    FROM 
        comments c
    -- 关联posts表的话保留这行
    JOIN posts p ON c.post_id = p.post_id
) AS ranked_comments
WHERE 
    rn = 1
ORDER BY 
    created_at DESC;

解释:PARTITION BY c.user_id会把评论按用户分组,ORDER BY c.created_at DESC让每组内最新的评论排在最前面,ROW_NUMBER()给每组的评论依次编号,最后筛选出编号为1的记录,就是每个用户的最新评论。

额外注意事项

  • 请根据你的实际表结构,替换示例中的user_id、created_at、content等字段名。
  • 如果用户的唯一标识(比如用户名)存在单独的users表,记得在查询里加入JOIN users u ON c.user_id = u.user_id,并选取u.username等字段。
  • 测试时可以先单独运行子查询部分,确认是否正确获取到了每个用户的最新评论时间/ID,再执行完整查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:15:16