Ich habe zwei Tabellen, Blogs und Beiträge, mit der erwarteten Beziehung zwischen ihnen. Beiträge können veröffentlicht oder verfasst werden. Ich möchte alle Blogs mit den Zählungen für veröffentlichte Beiträge und Entwürfe auswählen. Wie kann ich es tun?Wie erhalten Sie Zählungen von verschiedenen Joins zur selben Tabelle in SQL?
Ich habe versucht, diese Anfrage:
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
aber ich am Ende für beide published_post_count und draft_post_count mit der gleichen Anzahl und für beide falsch sind.
Dann habe ich verzweifelt und Trie:
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
aber in beiden Fällen hatte ich die gleichen falschen Ergebnissen.
Was ist der richtige Weg, dies zu tun?
Danke.
Dies funktioniert. Aber ist das nicht das Gleiche wie viele Abfragen? (N + 1) – Pablo
Nein. Da es sich um Unterabfragen handelt, die von den äußeren Abfragen abhängen. Und COUNT (*) ist nicht so ineffektiv. – Arion
Wenn Sie mit der Antwort zufrieden sind, können Sie die Antwort akzeptieren. – Arion