mysql - 'IN / ALL / ANY子查询'中的未知列

时间:2014-05-01 08:53:33

标签: php mysql

我有以下名为'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   
+------+-------+--------+------+

3 个答案:

答案 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

Fiddle Demo

答案 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;