我试图通过运行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]吗?
你可以做到
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中解释了它.
您可以通过将最后一个子句拉入(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)只会给您总计.