2011-02-05 73 views
5

我試圖通過查找它在MYSQL中收到的upvotes和downvotes的數量之間的差異來運行SELECT (SELECT COUNT(vote_id) AS vote_up FROMWHERE vote='UP'),(SELECT COUNT(vote_id) AS vote_down FROMWHERE vote='DOWN'),(vote_up - vote_down AS vote_score)。當我嘗試運行它時,它告訴我,我沒有正確的語法。我究竟做錯了什麼?獲取兩個子查詢的計數之間的差異

另外,有沒有更好的方式來寫這個?

最後,什麼是找到具有最高和最低票數的項目的理想方式?我只是ORDER BY [above query]

回答

3

您可以

SELECT some_id 
    , SUM(
     CASE 
     WHEN vote = 'UP' 
     THEN 1 
     WHEN vote = 'DOWN' 
     THEN -1 
     ELSE 0 
     END 
    ) as vote_score 
FROM votes 
GROUP BY some_id 

注意做到這一點的是,更好的方法是有+1或-1存儲在投票,那麼你可以這樣做:

SELECT some_id, SUM(vote) as vote_score 
FROM votes 
GROUP BY some_id 

順便說一句,如果我的格式看起來很奇怪,我在http://bentilly.blogspot.com/2011/02/sql-formatting-style.html解釋它。

+1

+1但是,您將因缺少「GROUP BY」子句而發生錯誤。 – 2011-02-05 02:38:25

+0

哇,謝謝!這工作完美。你的文章是一個很好的閱讀,雖然我通常不處理很長的查詢... – nickles 2011-02-05 02:52:19

+0

@ The Scrum Meister:你說得對。固定。我最希望的SQL是,如果我沒有一個GROUP BY,它會找出它應該基於我的SELECT ... – btilly 2011-02-05 03:16:08

1

跟進btilly的答案,如果你需要知道的最低和最高的,但做需要知道什麼ID具有最高/最低:

SELECT MIN(score), MAX(score) 
FROM (
    SELECT SUM(IF(vote = 'DOWN', -1, vote = 'UP')) AS score 
    FROM votes 
    GROUP BY ID 
) 

如果你需要知道ID ,使用內部查詢(將ID添加到select)與ORDER BY score LIMIT 1獲得最低值,並且ORDER BY score DESC LIMIT 1獲得最高值。 注意在關係的情況下,這將只選擇其中的一個。

4

您可以通過拉動,去年條款爲(SELECT ...)塊以及做到這一點:

SELECT 
    (SELECT COUNT(vote_id) FROM votes WHERE vote='UP') AS vote_up, 
    (SELECT COUNT(vote_id) FROM votes WHERE vote='DOWN') AS vote_down, 
    (SELECT vote_up - vote_down) AS vote_score 
ORDER BY vote_whatever; 

注btilly的回答大約爲+/- 1是給予好評/ downvote表示。這使得在這方面有更多的意義,並允許較小的表,更快的比較,使用SUM()功能的必要時:

SELECT SUM(vote) from votes; 

另外請注意:你只能得到vote_up和使用多vote_down計數(SELECT ...)方法 - SUM(CASE)只會給你總數。