我有一张如下表格:
votes
-----
page_id - long
vote_type - varchar which is either 'UP' or 'DOWN'
voter_id - varchar
我想做的是获得票数最多的前20页ID(UP票数减去DOWN票数)。
有人可以帮我解决这个功能的SQL查询吗?我基本上想要显示大多数投票页面的“高分”列表。
答案 0 :(得分:3)
如果可以的话,将投票作为数字更为明智,即“UP”为+1,“DOWN”为-1。然后你可以按每个页面进行分组,然后对它们进行SUM以获得累积的差异。
例如,表格如下:
votes
-----
page_id - long
voter_id - varchar (but should be long as well, though)
vote_score - int (+1, -1)
然后就这样做
SELECT SUM(vote_score) FROM votes GROUP BY page_id
要获得前N分,只需按总分排序:
SELECT SUM(vote_score) AS votes, page_id
FROM votes
GROUP BY page_id
ORDER BY votes ASC
答案 1 :(得分:2)
基本上,您需要使用案例陈述将'UP'
和'DOWN'
值映射到+1
和-1
。
SELECT TOP 20
page_id,
SUM(CASE vote_type
WHEN 'UP' THEN 1
WHEN 'DOWN' THEN -1
ELSE 0
END) AS score,
FROM
votes
GROUP BY
page_id
ORDER BY
score DESC;
答案 2 :(得分:0)
除了Kyle和csl的建议之外,还可以考虑存储(和索引)最终得分本身。这将允许您使用索引查询它。