MySQL不带子查询的负值和正值之和

MySQL不带子查询的负值和正值之和,mysql,sql,Mysql,Sql,我有两个表格如下: tbl_answers : id, (FK)authorID ... tbl_answer_votes : id, (FK)voterID, (FK)answerID, vote (sInt, only ever -1 or 1) tbl_answers与tbl_answer_投票有一对多的关系,投票可以是负1或正1 我需要将tbl_答案加入到tbl_答案中,但将该答案的所有反对票和所有赞成票的总和作为两个单独的列 我可以通过子查询来实现这一点,但由于这将是较大查询的一

我有两个表格如下:

tbl_answers : id, (FK)authorID ...

tbl_answer_votes : id, (FK)voterID, (FK)answerID, vote (sInt, only ever -1 or 1) 
tbl_answers
tbl_answer_投票有一对多的关系,投票可以是负1或正1

我需要将
tbl_答案
加入到
tbl_答案
中,但将该答案的所有反对票和所有赞成票的总和作为两个单独的列


我可以通过子查询来实现这一点,但由于这将是较大查询的一小部分,在阅读子查询的陷阱之后,我想尝试从投票表中尽可能高效地生成这两个负数和正数。

您可以使用
CASE
JOIN
来实现这一点:

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

这将返回来自
tbl\u answers
ID
,以及来自
tbl\u answers\u vows
的总票数的两列。您没有指定要从这两个表中选择哪些列(如果有),因此您可能必须调整
选择部分和
分组依据部分中的列列表,以添加其他列。

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

你有

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

然后你就可以加入了。

对不起,我没有时间。但在这里,你可能需要稍微转动一下

 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
 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