2011-10-06 81 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