我总是看到COUNT()与*一起用作参数而GROUP BY确定要计算的内容,但我相信你可以计算不同的东西,而不必进行子查询,分组,然后加入(这就是我现在正在做的事情)。
让我们用简化版的SO构建一个例子:
Table Question
idQuestion | title | idUser
Table Answer
idAnswer | idQUestion | text | idUser
Table Vote
idVote | idAnswer | type | idUser
Table Comment
idComment | idAnswer | text | idUser
要知道我所做的答案有多少评论和投票:
SELECT idAnswer, votes, comments FROM
(SELECT idAnswer, count(*) AS votes FROM Answer A
JOIN Vote B ON A.idAnswer=B.idAnswer
GROUP BY idAnswer) AS X
JOIN
(SELECT idAnswer, count(*) AS comments FROM Answer A
JOIN Comment B ON A.idAnswer=B.idAnswer
GROUP BY idAnswer) AS Y
ON X.idAnswer=Y.idAnswer
这可以在没有子选择的情况下完成吗?通过避免它们取得了什么成就?
如何在同一查询中计算负投票和正投票?
答案 0 :(得分:1)
SELECT idAnswer, COUNT(DISTINCT VOTE.idVote), COUNT(DISTINCT comments)
FROM Answer
LEFT JOIN COMMENT ON Answer.idAnswer = Comment.idAnswer
LEFT JOIN VOTE ON Answer.idAnswer = Vote.idAnswer
GROUP BY idAnswer
至于你问题的第二部分,感谢Andriy M!
SELECT
Answer.idAnswer,
COUNT(DISTINCT CASE WHEN VOTE.type = 'up' THEN VOTE.idVote END) AS upvotes,
COUNT(DISTINCT CASE WHEN VOTE.type = 'down' THEN VOTE.idVote END) AS downvotes,
COUNT(DISTINCT comments) as comments
FROM Answer
LEFT JOIN COMMENT ON Answer.idAnswer = Comment.idAnswer
LEFT JOIN VOTE ON Answer.idAnswer = Vote.idAnswer
GROUP BY Answer.idAnswer