私は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
が、両方のケースで私は、同じ間違った結果が得られました。
これを行うには適切な方法はありますか?
ありがとうございました。
これは機能します。しかし、これは多くのクエリを実行するのと同じではありませんか? (N + 1) – Pablo
いいえ。外部クエリに依存するサブクエリです。 COUNT(*)を実行してもそれほど効果的ではありません。 – Arion
答えがうまくいけば、答えを受け入れることを検討するかもしれません。 – Arion