MySQL Query design - подсчет голосов для нескольких элементов контента - PullRequest
1 голос
/ 06 октября 2011

У меня есть таблица элементов контента, структурированная как

|  contentid |   message     |    categoryid  |  userid  |    dateadded | etc.. 
     15          foo bar            3             4           somedate
     16          more foo bar       3             4           somedate
     16          foo stuff          3             4           somedate

и таблица голосов, где направление = 1 = голосование против, а = 2 - голосование против.

|  voteid   |  contentid |  userid  |  direction |    dateadded
    7             15          4            1           some date
    8             15          6            1           some date
    9             15          17           2           some date

И я хотел бы выбрать набор элементов контента, имеющих дополнительный столбец в конце с его рассчитанным баллом на основе голосов в таблице голосов.

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

Эта таблица голосов была разработана некоторое время назад, поэтому, если изменить значения всех голосов на значения, отличные от 1 или 2 (возможно, -1 для понижения голосов), будет проще, я обновлю всю таблицу.

Каким будет запрос для извлечения всех элементов контента, каждый из которых имеет оценку в вычисляемом столбце?

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Предполагая, что голосование "направление" представляет голоса "за" и "против":

SELECT i.contentid, 
       SUM(CASE WHEN v.direction = 1 THEN 1
                WHEN v.direction = 2 THEN -1
                ELSE 0 END) AS Votes
    FROM items i
        LEFT JOIN votes v
            ON i.contentid = v.contentid
    GROUP BY i.contentid
    HAVING SUM(CASE WHEN v.direction = 1 THEN 1
                WHEN v.direction = 2 THEN -1
                ELSE 0 END) > -3
0 голосов
/ 06 октября 2011
SELECT
  items.*,
  SUM(direction = 1) - SUM(direction = 2) AS score
FROM items
LEFT JOIN votes USING (contentid)
GROUP BY contentid

Причина, по которой это работает, заключается в том, что истинное сравнение оценивается в 1, а ложное - в 0.

...