sql - 如何从 SQL 中的同一个表的各种连接中获取计数?

标签 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

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

执行此操作的正确方法是什么?

谢谢。

最佳答案

如果您只对 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/

相关文章:

python - 将日期时间条目插入具有 TIMESTAMP 数据类型的表中

python - 使用 Flask-SQLAlchemy 查询

postgresql - 使用规则插入副表自增序列

sql - 如何为两个字段值选择相等数量的行?

mysql - 使用日期范围和数字过滤器连接 2 个表

php - 在选择查询中从另一个表中选择全部

sql - 值连续 n 分钟超过阈值

django - 在 Django 中实现 PostgreSQL HStore

ruby-on-rails - 我如何在表单中包含 Rails 连接表字段?

sql - 如何传递 ERROR : more than one row returned by a subquery used as an expression