MySQL сумма отрицательных и сумма положительных значений без подзапроса - PullRequest
3 голосов
/ 28 января 2012

У меня есть две таблицы:

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

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

Ответы [ 3 ]

4 голосов
/ 28 января 2012

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

1 голос
/ 28 января 2012

Извините, у меня нет времени. но здесь вам, возможно, придется немного его изменить.

 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
0 голосов
/ 28 января 2012

Напишите запрос, который возвращает сумму голосов и количество голосов за каждый ответ.

Поскольку

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...