2012-01-28 6 views
3

у меня есть две таблицы следующим образом:MySQL сумма отрицательна и сумма положительных значений без подзапросом

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, но при этом получить сумму всех отрицательных голосов за этот ответ и сумму всех положительных голосов за ответ в виде двух отдельных столбцов.

Я могу сделать это путем подзапроса, но так как это будет небольшая часть более крупного запроса, и после прочтения подводных камней по подзапросам я хотел бы попытаться произвести эти две отрицательные и положительные суммы из таблицы голосов насколько это возможно.

ответ

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, чтобы добавить дополнительные столбцы.

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 

, а затем вы должны быть в порядке для части соединения.

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 
Смежные вопросы