我有两个表,博客和帖子,它们之间具有预期的关系。帖子可以发布或草稿。我想选择所有包含已发布帖子和草稿帖子的博客。我该怎么做?
我试过这个查询:
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
但在这两种情况下我都得到了相同的错误结果。
执行此操作的正确方法是什么?
谢谢。
最佳答案
如果您只对 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
关于sql - 如何从 SQL 中的同一个表的各种连接中获取计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10028106/