获得两个子查询的计数之间的差异

时间:2011-02-05 02:24:37

标签: mysql

我正在尝试通过运行SELECT (SELECT COUNT(vote_id) AS vote_up FROM投票WHERE vote='UP'),(SELECT COUNT(vote_id) AS vote_down FROM投票WHERE vote='DOWN'),(vote_up - vote_down AS vote_score)来查找在MYSQL中收到的upvotes和downvotes之间的差异来确定条目的得分。当我尝试运行它时,它告诉我,我没有正确的语法。我究竟做错了什么?

另外,有没有更好的方法来写这个?

最后,找到票数最高和最低的项目的理想方式是什么?我会ORDER BY [above query]吗?

3 个答案:

答案 0 :(得分:5)

你可以用

完成
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 :(得分:5)

你可以通过将最后一个句子拉入(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作为upvote / downvote表示的答案。它在这种情况下更有意义,并允许更小的表,更快的比较,并在必要时使用SUM()函数:

SELECT SUM(vote) from votes;

另请注意:您只能使用多个(SELECT ...)方法获得vote_up和vote_down计数 - SUM(CASE)只会为您提供总数。

答案 2 :(得分: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添加到选择中),ORDER BY score LIMIT 1获取最低值,ORDER BY score DESC LIMIT 1获取最高值。 注意在关系的情况下,这将只选择其中一个。