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

Mysql 获取两个子查询计数之间的差异,mysql,Mysql,我试图通过运行SELECT(选择COUNT(vote_id)作为vote_-up FROMvotesWHERE vote='up'),(选择COUNT(vote_id)作为vote_-down FROMvotesWHERE vote='down')来查找MYSQL中收到的向上投票数和向下投票数之间的差异来确定条目的分数,(vote\u up-vote\u down作为vote\u score)。当我尝试运行此操作时,它告诉我没有正确的语法。我做错了什么 还有,有没有更好的方法来写这个 最后,找到

我试图通过运行
SELECT(选择COUNT(vote_id)作为vote_-up FROM
votes
WHERE vote='up'),(选择COUNT(vote_id)作为vote_-down FROM
votes
WHERE vote='down')来查找MYSQL中收到的向上投票数和向下投票数之间的差异来确定条目的分数,(vote\u up-vote\u down作为vote\u score)
。当我尝试运行此操作时,它告诉我没有正确的语法。我做错了什么

还有,有没有更好的方法来写这个

最后,找到票数最高和票数最低的项目的理想方法是什么?我是否可以通过[上面的查询]排序?

您可以使用

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存储在vote中,然后您可以执行以下操作:

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

顺便说一句,如果你觉得我的格式很奇怪,我会在中解释。

跟进btilly的答案,如果你需要知道最低和最高的ID,但不需要知道哪个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
获取最高值。
注意:在连接的情况下,这将只选择其中的一个。

您可以通过将最后一个子句拉入
(选择…
块)来实现:

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作为向上投票/向下投票表示的回答。在这种情况下,它更有意义,允许更小的表、更快的比较,并在必要时使用
SUM()
函数:

SELECT SUM(vote) from votes;

另请注意:您只能使用多个
(选择…
方法-
求和(大小写)获得向上投票和向下投票计数
只会给你总数。

+1但是你会因为缺少一个
GROUP BY
子句而得到一个错误。哇,谢谢!这非常有效。你的帖子读得很好,尽管我通常不会处理很长的查询…@Scrum-Meister:你是对的。修复了。我对SQL最大的愿望是如果我没有分组,它会根据我的选择来确定它应该是什么…谢谢!不幸的是,我需要条目的id和介于两者之间的值。好吧,我觉得现在为第三个查询省去最初的选择是愚蠢的。唯一真正回答标题中问题的答案