MySQL关联查询需求:获取所有帖子及已审核评论数
问题分析与解决方案
你的问题出在WHERE子句的过滤条件上:当使用LEFT JOIN时,没有匹配到符合条件评论的帖子(比如sample3),c.is_approved会是NULL,而WHERE c.is_approved=1会直接把这些行过滤掉,所以你看不到sample3的记录。
你的表结构
Posts表
- id
- title
Comments表
- id
- post_id(外键关联Posts表)
- is_approved
- comment
示例数据
Posts表
| id | title |
|---|---|
| 1 | sample1 |
| 2 | sample2 |
| 3 | sample3 |
Comments表
| id | post_id | is_approved | comment |
|---|---|---|---|
| 1 | 1 | 1 | hello |
| 2 | 2 | 1 | hi |
修正后的查询语句
把is_approved=1的条件移到JOIN的ON子句里,同时调整GROUP BY的分组依据为帖子的唯一标识,这样就能保留所有帖子并统计符合条件的评论数:
SELECT p.title, COUNT(c.post_id) AS total FROM posts AS p LEFT JOIN comments AS c ON p.id = c.post_id AND c.is_approved = 1 -- 将审核条件放在JOIN关联规则中 GROUP BY p.id, p.title -- 基于帖子自身的字段分组,确保无评论的帖子也被保留
改动原因说明
- 条件位置调整:把审核条件放在
ON子句时,LEFT JOIN会保留所有帖子行,仅关联符合条件的评论,不符合条件的评论不会被关联,对应字段为NULL,不会过滤掉无评论的帖子。 - 分组依据调整:用
p.id和p.title分组,确保每个帖子作为独立分组,即使没有匹配的评论也会被统计。 - COUNT函数特性:
COUNT(c.post_id)会自动忽略NULL值,所以无符合条件评论的帖子会返回0,正好满足你的需求。
最终输出结果
执行上述查询后,你会得到期望的结果:
| title | total |
|---|---|
| sample1 | 1 |
| sample2 | 1 |
| sample3 | 0 |
内容的提问来源于stack exchange,提问作者shamon shamsudeen
相关产品推荐
相关产品推荐

