私は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
次のようなネストされた選択を使用できます。
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
注:おそらくもっとエレガントな解決策があります!!!!
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
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
テーブルと一緒に非正規化することを評価できます。その中の列。