MySQL LEFT JOIN不返回左表中的所有行

时间:2012-07-15 18:52:09

标签: mysql

我最近一直在研究博客系统,我遇到了一个问题。我有两个表,一个用于博客帖子,另一个用于评论这些帖子。这是我目前用于检索所有帖子信息以及评论数量的查询:

SELECT bp.*, COUNT(bpc.id) AS post_comments
FROM blog_posts AS bp
LEFT JOIN blog_post_comments AS bpc ON bpc.post_id = bp.id
LIMIT 0, 10

现在,正如我在标题中所述,这只返回一篇关于一篇文章的数据,尽管它应该返回10篇帖子。为什么会这样?

谢谢!

3 个答案:

答案 0 :(得分:4)

您缺少GROUP BY子句,并且由于MySQL对于SELECT中的聚合函数和列没有出现在组中,因此它会向下折叠到显示总计数的一行,但是来自其他列的混合列值。

SELECT bp.*, COUNT(bpc.id) AS post_comments
FROM blog_posts AS bp
LEFT JOIN blog_post_comments AS bpc ON bpc.post_id = bp.id
GROUP BY bp.id
LIMIT 0, 10

为MySQL之外的RDBMS执行此操作的更便携方式是加入一个子查询,该子查询仅返回post_id和每个id的帖子数,允许其余列{{1} }被选中而不会出现在blog_posts

GROUP BY

答案 1 :(得分:2)

由于您使用COUNT,因此会将所有帖子视为相同。 试试看它是否有效:

SELECT bp.*, COUNT(bpc.id) AS post_comments
FROM blog_posts AS bp
LEFT JOIN blog_post_comments AS bpc ON bpc.post_id = bp.id 
GROUP BY bp.id
LIMIT 0, 10

我不确定这是不是问题。只是猜测。 :)

答案 2 :(得分:1)

您获得一条记录,因为COUNT()是一个聚合函数。您应该添加GROUP BY子句,COUNT()将按您的意愿工作。