2011-10-06 53 views
1

我有一个内容项目表结构类似于MySQL查询设计 - 计算表决分数多个内容项

| 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的downvote)会更容易,我会更新整个表。

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

回答

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 
+0

谢谢乔。如果我在WHERE子句中使用这个新的'Votes'计算列,它会抱怨它不知道'Votes'是什么(例如选择大于-3的内容)。在这里声明之后,我如何参考计算列? – barfoon

+0

@Barfoon:你会用'HAVING'子句测试它。我会更新答案。 –

+0

谢谢。在这种情况下,你必须执行两次“SUM”? – barfoon

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

这部作品的原因是因为一个真正的比较结果为1和虚假一个0