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

如何用PHP内连接(INNER JOIN)统计单篇帖子的评论总数?

解决方案:获取单篇帖子的评论总行数

当然可行啦!不过你当前的SQL语句有两处小问题需要调整,才能正确拿到每篇帖子的评论总数,我来帮你梳理修改方案:

1. 修正SQL查询逻辑

你现在的INNER JOIN comments会把每条评论都返回一次,导致同一篇帖子重复出现(有多少条评论就出现多少次),而且关联条件还写错了(应该是comments.post_id = posts.post_id,不是posts.post_id = comment_id)。

要统计单篇帖子的评论数,我们需要用**聚合函数COUNT()**配合GROUP BY来分组统计,同时建议用LEFT JOIN替代INNER JOIN(避免过滤掉没有评论的帖子)。修改后的代码如下:

if($stmt = $pdo->prepare("
    SELECT 
        posts.*, 
        categories.category, 
        COUNT(comments.comment_id) AS total_comments
    FROM posts 
    INNER JOIN categories ON posts.cat_id = categories.cat_id 
    LEFT JOIN comments ON posts.post_id = comments.post_id 
    WHERE posts.user_id = :sid
    GROUP BY posts.post_id
")){ 
    $stmt->execute(array('sid'=>$sid));
}

关键说明:

  • COUNT(comments.comment_id):统计每篇帖子对应的有效评论数(comment_id不为空的记录),并给这个统计结果起别名total_comments。
  • LEFT JOIN comments:即使帖子没有评论,也会保留这条帖子数据,此时total_comments会显示为0。如果用INNER JOIN,没有评论的帖子会被直接过滤掉。
  • GROUP BY posts.post_id:按照帖子ID分组,确保每篇帖子只返回一条包含评论总数的记录。

2. 遍历结果并展示评论数

修改完SQL后,你就可以在while循环里直接调用$row['total_comments']来展示了,示例代码:

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    // 展示帖子标题(假设你的posts表有post_title字段)
    echo "帖子标题:" . $row['post_title'] . "<br>";
    // 展示分类
    echo "分类:" . $row['category'] . "<br>";
    // 展示评论总数
    echo "Total comments on post : " . $row['total_comments'] . "<br><br>";
}

额外注意事项

如果你的MySQL开启了ONLY_FULL_GROUP_BY模式(默认开启),直接用上面的SQL可能会报错,因为GROUP BY需要包含所有非聚合的字段。这时可以用ANY_VALUE()函数包裹非聚合字段,或者明确列出所有需要的字段:

SELECT 
    posts.post_id,
    posts.post_title,
    posts.post_content,
    ANY_VALUE(categories.category) AS category,
    COUNT(comments.comment_id) AS total_comments
FROM posts 
INNER JOIN categories ON posts.cat_id = categories.cat_id 
LEFT JOIN comments ON posts.post_id = comments.post_id 
WHERE posts.user_id = :sid
GROUP BY posts.post_id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:19:52