2

私は2つのテーブル、ブログと投稿を持っており、それらの間には予想される関係があります。投稿は公開またはドラフトできます。公開された投稿とドラフト投稿の数が含まれるすべてのブログを選択したいと思います。どうすればいいですか?

私はこのクエリを試しました:

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

しかし、どちらの場合も、同じ間違った結果が得られました。

これを行うための適切な方法は何ですか?

ありがとう。

4

3 に答える 3

4

だけに興味があり、テーブルCOUNTJOINing している場合。そのため、1 つまたは複数のpost「されている」publishedと、1 つまたは複数の「ある」が存在する必要があり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
于 2012-04-05T12:04:56.460 に答える
2

さまざまな州を数えて、ブログに参加することができます。

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
于 2012-04-05T12:12:39.017 に答える
1

試す :

GROUP BY blogs.id,published_posts.[theKeyOfThisTable],draft_posts.[theKeyOfThisTable]

「group by」句に「select」の列を含める必要があるため

于 2012-04-05T12:08:43.203 に答える