web-dev-qa-db-ja.com

テーブルからCOUNTを結合し、そのCOUNTを別のJOINで実行する方法

私は3つのテーブルを持っています

役職

ID  Name
1   'Something'
2   'Something else'
3   'One more'

コメント

ID  PostId  ProfileID  Comment
1   1       1          'Hi my name is' 
2   2       2          'I like cakes'
3   3       3          'I hate cakes'

プロフィール

ID  Approved
1   1          
2   0          
3   1          

コメントのプロファイルが承認された投稿のコメントを数えたい

投稿からデータを選択し、コメントからカウントに参加できます。ただし、この数は、プロファイルが承認されているかどうかによって異なります。

私が期待している結果は

CommentCount

PostId  Count
1       1
2       0
3       1
12
Jake N

次のようなネストされた選択を使用できます。

SELECT Post.Id, temp.Count
FROM Post
LEFT JOIN
(SELECT Post.Id, COUNT(Comment.ID) AS Count
FROM Post
LEFT JOIN Comment ON Comment.PostId = Post.ID
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
WHERE Profile.Approved = 1
GROUP BY Post.Id)
temp ON temp.Id = Post.ID

これは、レコードがないのではなく、投稿がない場合にnullを与えます。

1  1
2  null
3  1

それを改善するために、ifを使用してnullを取り除くことができます

SELECT Post.Id, if(temp.Count >= 1,temp.Count,0) as newCount
FROM Post
LEFT JOIN
(SELECT Post.Id, COUNT(Comment.ID) AS Count
FROM Post
LEFT JOIN Comment ON Comment.PostId = Post.ID
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
WHERE Profile.Approved = 1
GROUP BY Post.Id) temp ON temp.Id = Post.ID

それはあなたが最初に望んでいたものをあなたに与えます:

1  1
2  0
3  1

注:おそらくもっとエレガントな解決策があります!!!!

14
theandywaite

COUNT関数の定義から:

COUNT関数は、括弧内のフィールドがNULLでないレコードのみをカウントします。

これは、次のような単純な外部結合が機能することを意味します。

SELECT Post.ID, COUNT(Comment.ID)
  FROM Post LEFT JOIN Comment ON (Post.ID = Comment.PostId)
            LEFT JOIN Profile ON (Profile.ID = Comment.ProfileID AND
                                  Profile.Approved = 1)
 GROUP BY Post.ID
5
topchef
SELECT Post.Id, COUNT(Comment.ID) AS Count
FROM Post
LEFT JOIN Comment ON Comment.PostId = Post.ID
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
WHERE Profile.Approved = 1
GROUP BY Post.Id

例のために貼り付けなかった可能性がありますが、Profileを移動することにより、CommentテーブルをApprovedテーブルと一緒に非正規化することを評価できます。その中の列。

1
Alex Bagnolini