我正在尝试通过运行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]
吗?
答案 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
获取最高值。
注意在关系的情况下,这将只选择其中一个。