2012-04-05 19 views
2

我有兩張表,博客和文章,以及他們之間的預期關係。帖子可以發佈或起草。我想選擇所有發佈和發佈帖子數量的博客。我該怎麼做?如何從SQL中的各個連接到同一個表中計數?

我嘗試此查詢:

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 

但在這兩種情況下,我有同樣的錯誤的結果。

這樣做的正確方法是什麼?

謝謝。

回答

4

如果您只是對COUNT感興趣,而您也是JOIN的表格。所以必須有一個或多個post已經published和一個或多個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 
+0

這個工程。但是,這與運行很多查詢不一樣嗎? (N + 1) – Pablo 2012-04-06 19:35:36

+0

否。因爲它是依賴於外部查詢的子查詢。做COUNT(*)並不是那麼無效。 – Arion 2012-04-06 20:25:17

+0

如果你對答案很好,你可以考慮接受答案。 – Arion 2012-04-06 20:26:23

1

嘗試:

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

,你應該包含的「選擇」在你列「GROUP BY」子句

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 
+0

對於大型表格,我認爲這比相關的子查詢方法快得多,儘管這樣做值得進行測試以確認。我很驚訝CASE謂詞沒有「其他0」子句,但是一個快速測試表明,沒有它們就可以正常工作。 – kgrittn 2012-04-08 13:15:57

相關問題