我有以下名为'votes'的表,其中参与者的upvote(1)和downvote(-1)存储。我希望获得前三名投票参与者ID及其总票数,其中总票数= upvote - downvote。我在下面给出了查询,但收到错误:“IN / ALL / ANY子查询中的未知列'total_votes'”
table 'votes' --------------------------------- | participant_id | vote| voter_id +------+-------+---------+------+ | 1 | 1 | 1 | 2 | 1 | 1 | 3 | 1 | 1 | 4 | -1 | 1 | 5 | 1 | 1 | 1 | -1 | 2 | 2 | 1 | 2 | 3 | 1 | 2 | 4 | 1 | 2 | 5 | 1 | 2 | 1 | 1 | 3 | 2 | 1 | 3 | 3 | -1 | 3 | 4 | -1 | 3 +------+-------+---------+-----+
SELECT `participant_id`, SUM( `vote` ) AS total_votes FROM `votes`
WHERE total_votes IN
(SELECT total_votes FROM
(SELECT DISTINCT (SUM( vote )) AS total_votes FROM `votes` GROUP BY `participant_id`
ORDER BY `total_votes` DESC LIMIT 0 , 3) AS temp )
GROUP BY `participant_id`
Expected result would be ------------------------------- | participant_id | total_votes +------+-------+--------+------+ | 2 | 3 | 5 | 2 | 1 | 1 | 3 | 1 +------+-------+--------+------+
答案 0 :(得分:3)
您可以通过使用联接来重写您的查询,以获得投票得分位于前3票的最高参与者,即前3票(3,2,1)
SELECT t.* FROM
(SELECT `participant_id`, SUM( `vote` ) AS total_votes
FROM `votes`
GROUP BY `participant_id`
) t
JOIN (SELECT SUM( `vote` ) AS total_votes FROM `votes`
GROUP BY `participant_id`
ORDER BY `total_votes` DESC LIMIT 0 , 3 ) t1
USING(total_votes)
ORDER BY t.total_votes DESC
答案 1 :(得分:0)
您要执行的操作是关注,因为表格中没有total_votes
列:
SELECT `participant_id`, SUM( `vote` ) AS total_votes FROM `votes`
WHERE votes IN
(SELECT total_votes FROM
(SELECT DISTINCT (SUM( vote )) AS total_votes FROM `votes` GROUP BY `participant_id`
ORDER BY `total_votes` DESC LIMIT 0 , 3) AS temp )
GROUP BY `participant_id`
答案 2 :(得分:0)
检查这个简单的查询:
SELECT
participant_id, total_votes
FROM
(SELECT participant_id,SUM(vote) total_votes
FROM votes
GROUP BY participant_id) a
ORDER BY total_votes DESC
LIMIT 3;
要获得前3名投票的所有参与者,您可以使用以下查询:
SELECT
a.participant_id, b.total_votes
FROM
(SELECT participant_id, SUM(vote) total_votes
FROM votes
GROUP BY participant_id) a
JOIN
(SELECT participant_id,SUM(vote) total_votes
FROM votes
GROUP BY participant_id
ORDER BY total_votes DESC LIMIT 3) b
ON a.total_votes=b.total_votes
ORDER BY total_votes DESC;