投稿にSQLジョインを追加すると、コメントに投稿された投稿テーブルを照会し、クリックして投票し、各投稿のアクティビティに関する統計を返すようになっています。以下の私の質問は私が使ってきたものです。SQLクエリは各列で同じ値を返します
SELECT
p.PostID,
p.Title,
CASE
WHEN COUNT(cm.CommentID) IS NULL THEN 0
ELSE COUNT(cm.CommentID)
END AS CommentCount,
CASE
WHEN COUNT(cl.ClickID) IS NULL THEN 0
ELSE COUNT(cl.ClickID)
END AS ClickCount,
CASE
WHEN SUM(vt.Value) IS NULL THEN 0
ELSE SUM(vt.Value)
END AS VoteScore
FROM
Post p
LEFT OUTER JOIN Comment cm ON p.PostID = cm.PostID
LEFT OUTER JOIN Click cl ON p.PostID = cl.PostID
LEFT OUTER JOIN Vote vt ON p.PostID = vt.PostID
GROUP BY
p.PostID,
p.Title
は、次のような結果
| PostID | CommentCount | ClickCount | VoteScore |
|--------|--------------|------------|-----------|
| 41 | 60| 60| 60|
| 50 | 1683| 1683| 1683|
これをもたらし、私は知って正しくありません。一つが、コメントアウトすべてが参加すると:
SELECT
p.PostID
,p.Title
,CASE
WHEN COUNT(cm.CommentID) IS NULL THEN 0
ELSE COUNT(cm.CommentID)
END AS CommentCount
/*
,CASE
WHEN COUNT(cl.ClickID) IS NULL THEN 0
ELSE COUNT(cl.ClickID)
END AS ClickCount
,CASE
WHEN SUM(vt.Value) IS NULL THEN 0
ELSE SUM(vt.Value)
END AS VoteScore
*/
FROM
Post p
LEFT OUTER JOIN Comment cm ON p.PostID = cm.PostID
/*
LEFT OUTER JOIN Click cl ON p.PostID = cl.PostID
LEFT OUTER JOIN Vote vt ON p.PostID = vt.PostID
*/
GROUP BY
p.PostID,
p.Title
私は正しいです
| PostID | CommentCount |
|--------|--------------|
| 41 | 3|
を取得します。私が間違っていたことは何ですか?
ありがとうございました。
あなたがここにCASE式を使用している理由はわかりません。 ISNULL(COUNT(cm.CommendID)、0)は、CommentCountとして多くのクリーナーと簡単です。私の推測では、あなたの結合にいくつかの論理的な問題がありますが、いくつかのddlやサンプルデータがなければ、ここで多くの助けをするのは本当に難しいです。 –
'left join'はおそらく1:たくさんの関係にあります。これは' post'と 'comment'のレコードを複製して' click'や 'vote'の余分なレコードを全て収容するためです。 'Count(Distinct cm.commentid) 'と' Count(Distinct cm.mentid) 'を行うために' Count() '集計を行いましょう。 'Vote(投票)はおそらく最も細かいので、あなたの' Sum() 'はうまくいきますが、それは推測です。 – JNevill
すでに説明したように、重複を数えています。そして、私は 'vote'は常に1であると思うので、' sum'は 'count'と同じ結果になります。そして、countがnullでないので、 'count'の周りの' case'は余計です。 –