2011-02-05 145 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)只会给你总数。