如何从SQL中的各个连接计数到同一个表?

时间:2012-04-05 11:55:41

标签: sql postgresql join count

我有两个表,博客和帖子,它们之间有预期的关系。帖子可以发布或草稿。我想选择所有已发布和草稿帖子的博客。我该怎么办?

我尝试了这个查询:

SELECT blogs.*,
       COUNT(published_posts.*) AS published_post_count,
       COUNT(draft_posts.*) AS draft_post_count
FROM blogs
JOIN posts AS published_posts ON published_posts.blog_id=blogs.id AND 
                                 published_posts.state = "published"
JOIN posts AS draft_posts ON draft_posts.blog_id=blogs.id AND 
                             draft_posts.state = "draft"
GROUP BY blogs.id

但是对于published_post_count和draft_post_count,我的结果都是相同的,但两者都错了。

然后我变得绝望和特里:

SELECT blogs.*,
       COUNT(published_posts.*) AS published_post_count,
       COUNT(draft_posts.*) AS draft_post_count
FROM blogs
JOIN (SELECT * FROM posts WHERE posts.state="published") AS published_posts
     ON published_posts.blog_id=blogs.id 
JOIN (SELECT * FROM posts WHERE posts.state="draft") AS draft_posts
     ON draft_posts.blog_id=blogs.id
GROUP BY blogs.id

但在这两种情况下我都有相同的错误结果。

这样做的正确方法是什么?

感谢。

3 个答案:

答案 0 :(得分:4)

如果您只对COUNT感兴趣,并且您也JOIN了表格。因此,必须有一个或多个postpublished且一个或多个draft。所以这可能会对你有所帮助:

SELECT blogs.*,
       (
            SELECT COUNT(*)
            FROM posts
            WHERE posts.blog_id=blogs.id
            AND posts.state = "published"
       ) AS published_post_count,
       (
            SELECT COUNT(*)
            FROM posts
            WHERE posts.blog_id=blogs.id
            AND posts.state = "draft"
       ) AS draft_post_count,
FROM blogs

答案 1 :(得分:1)

尝试:

GROUP BY blogs.id,published_posts.[theKeyOfThisTable],draft_posts.[theKeyOfThisTable]

因为您应该在“group by”子句中包含“select”的列

答案 2 :(得分:1)

您可能会计算不同的状态并加入博客:

SELECT blogs.*, p.published_post_count, p.draft_post_count
FROM blogs
JOIN 
(
  SELECT posts.blog_id,
         SUM(case when posts.state = 'published' then 1 end) 
             AS published_post_count,
         SUM(case when posts.state = 'draft' then 1 end) 
             AS draft_post_count
    FROM posts
   GROUP BY blog_id
) p
ON p.blog_id=blogs.id