MySQL总和为负值和正值之和,不带子查询

时间:2012-01-28 00:15:48

标签: mysql sql

我有两张表如下:

tbl_answers : id, (FK)authorID ...

tbl_answer_votes : id, (FK)voterID, (FK)answerID, vote (sInt, only ever -1 or 1) 

tbl_answerstbl_answer_votes有一对多关系,投票可以为负1或正1。

我需要将tbl_answer_votes加入tbl_answers,但会将该答案的所有反对票数和所有正面投票的总和产生为两个单独的列。

我可以通过子查询来做到这一点,但因为它将是一个较大查询的一小部分,在阅读了子查询的缺陷后,我想尝试从投票表中产生这两个负和正数尽可能高效。

3 个答案:

答案 0 :(得分:4)

您可以使用CASEJOIN来完成此操作:

SELECT 
  a.id, 
  SUM(CASE v.vote when 1 then 1 else 0 end) as UpVotes,
  SUM(CASE v.vote when -1 then 1 else 0 end) as DownVotes
FROM 
  tbl_answers a
INNER JOIN 
  tbl_answer_votes v
ON 
  v.id = a.id
GROUP BY 
  a.id

这将返回ID中的tbl_answers以及两列中tbl_answer_votes的任意值的总票数。您没有在任何一个表中指定您想要的其他列(如果有),因此您可能需要调整SELECTGROUP BY部分中的列列表以添加其他列。< / p>

答案 1 :(得分:1)

抱歉,我没时间。但在这里你可能需要稍微调整一下。

 select a.id, SUM(CASE WHEN v.vote = 1 Then 1 ELSE 0 END ), SUM(CASE WHEN (v.vote = -1) then 1 ELSE 0 end)
from tbl_answers a
inner join tbl_answer_votes v
    On a.id = v.asnwerId
where a.id = 123
group by a.id

答案 2 :(得分:0)

写一个查询,返回投票总数和每个答案的投票数。

由于

sum of votes = positive votes - negative votes
count of votes = positive votes + negative votes

你有

positive votes = (count+sum)/2
negative votes = (count-sum)/2

所以只需将这些表达式添加到您的查询中即可。像

这样的东西
SELECT answerID, (COUNT(*)+SUM(vote))/2 as upvotes,
                 (COUNT(*)-SUM(vote))/2 as downvotes
FROM tbl_answer_votes
GROUP BY answerID

然后你应该对连接部分没问题。