mySQL查询设计 - 计算多个内容项的投票得分

时间:2011-10-06 16:00:43

标签: mysql calculated-columns

我有一个像

这样的内容项表
|  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

和投票表,其中direction = 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

我想选择一组内容项目,最后根据投票表中的投票计算得分。“/ p>

之前,我在内容表中附加了一个“得分”列,每次投票时,都会更新其得分。这样做了所以我不需要有更复杂的查询来计算每个SELECT的分数,但我现在想改变它。

此投票表是前一段时间设计的,所以如果将所有投票值更改为1或2以外的值(对于downvote可能为-1)会使其更容易,我将更新整个表格。

查询将拉出所有内容项目,每个内容项目都有一个计算列中的分数?

2 个答案:

答案 0 :(得分:2)

假设投票“方向”代表上下投票:

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

答案 1 :(得分:0)

SELECT
  items.*,
  SUM(direction = 1) - SUM(direction = 2) AS score
FROM items
LEFT JOIN votes USING (contentid)
GROUP BY contentid

这可行的原因是因为真正的比较评估为1而虚假评估评估为0