1

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

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 篇文章。为什么会这样?

谢谢!

4

3 回答 3

4

您缺少该GROUP BY子句,并且由于 MySQL 对未出现在 group by 中的聚合函数和列很宽容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 的帖子数和帖子数,从而允许选择其余列blog_posts而不出现在GROUP BY.

SELECT
  bp.*,
  bcount.counts
FROM 
  blog_posts AS bp
  LEFT JOIN (
     SELECT post_id, COUNT(*) AS counts 
     FROM blog_post_comments 
     GROUP BY post_id
  ) bcounts ON bp.id = bcounts.post_id
于 2012-07-15T18:55:45.037 回答
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

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

于 2012-07-15T18:55:46.583 回答
1

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

于 2012-07-15T18:55:36.690 回答