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

nic*_*les 7 mysql

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

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

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

bti*_*lly 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 
Run Code Online (Sandbox Code Playgroud)

请注意,更好的方法是在投票中存储+1或-1,然后您可以这样做:

SELECT some_id, SUM(vote) as vote_score
FROM votes
GROUP BY some_id
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果我的格式看起来很奇怪,我在http://bentilly.blogspot.com/2011/02/sql-formatting-style.html中解释了它.


Xav*_*olt 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;
Run Code Online (Sandbox Code Playgroud)

注意btilly关于将+/- 1作为upvote/downvote表示的答案.它在这种情况下更有意义,并允许更小的表,更快的比较,并SUM()在必要时使用该函数:

SELECT SUM(vote) from votes;
Run Code Online (Sandbox Code Playgroud)

另请注意:您只能使用multiple (SELECT ...)方法获得vote_up和vote_down计数- SUM(CASE)只会给您总计.

  • 真正回答标题中问题的唯一答案 (2认同)