我有两个表,博客和帖子,它们之间有预期的关系。帖子可以发布或草稿。我想选择所有已发布和草稿帖子的博客。我该怎么办?
我尝试了这个查询:
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
但在这两种情况下我都有相同的错误结果。
这样做的正确方法是什么?
感谢。
答案 0 :(得分: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
答案 1 :(得分:1)
尝试:
GROUP BY blogs.id,published_posts.[theKeyOfThisTable],draft_posts.[theKeyOfThisTable]
因为您应该在“group by”子句中包含“select”的列
答案 2 :(得分: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