我有两张表如下:
tbl_answers : id, (FK)authorID ...
tbl_answer_votes : id, (FK)voterID, (FK)answerID, vote (sInt, only ever -1 or 1)
tbl_answers
与tbl_answer_votes
有一对多关系,投票可以为负1或正1。
我需要将tbl_answer_votes
加入tbl_answers
,但会将该答案的所有反对票数和所有正面投票的总和产生为两个单独的列。
我可以通过子查询来做到这一点,但因为它将是一个较大查询的一小部分,在阅读了子查询的缺陷后,我想尝试从投票表中产生这两个负和正数尽可能高效。
答案 0 :(得分:4)
您可以使用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
这将返回ID
中的tbl_answers
以及两列中tbl_answer_votes
的任意值的总票数。您没有在任何一个表中指定您想要的其他列(如果有),因此您可能需要调整SELECT
和GROUP 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
然后你应该对连接部分没问题。