2013-06-13 62 views
1

我试图从一个由spot_id和vote_type分组的表中得到最大的行总数,但我需要的其他字段(video_id)不在组中,所以我这就是为什么它会在结果集中给出错误的video_id。我的查询出了什么问题?SQL MAX与GROUP BY得到错误的非分组字段

查询:

SELECT 
    max(total_votes) as total, spot_id, vote_type, video_id 
FROM 
    (
    SELECT 
     count(*) as total_votes, spot_id, video_id, vote_type 
    FROM 
     spot_video_votes 
    GROUP BY 
     spot_id, video_id, vote_type 
    ) AS t 
GROUP BY 
    spot_id, vote_type 

子查询的结果:

total_votes, spot_id, video_id, vote_type 
'1','1','2','OWN' 
'1','1','3','OWN' 
'4','1','4','OWN' -- should pick this 
'1','2','3','FAIL' 
'2','2','3','OWN' -- this 
'2','2','4','FAIL' -- and this 
'1','2','4','OWN' 

实际结果:

total, spot_id, video_id, vote_type 
'4','1','2','OWN' 
'2','2','3','FAIL' 
'2','2','3','OWN' 

预期结果:

total, spot_id, video_id, vote_type 
'4','1','4','OWN' 
'2','2','4','FAIL' 
'2','2','3','OWN' 
+0

您已经选择其中没有添加VIDEO_ID部分分组,所以服务器可以自由选择任何列..参考http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html – Meherzad

+0

我看到...我知道一些随机选择正在进行,但不知道如何构建查询。谢谢! –

回答

1

如果没有按video_id字段进行分组,您将收到来自相应分组字段的仲裁值。

一种选择是加入到了极致查询本身的结果 - 是这样的:

SELECT t1.total_votes as total, t1.spot_id, t1.vote_type, t1.video_id 
FROM 
    (
    SELECT count(*) as total_votes, spot_id, video_id, vote_type 
    FROM spot_video_votes 
    GROUP BY spot_id, video_id, vote_type 
    ) AS t1 JOIN 
    (
    SELECT max(total_votes) as max_total_votes, spot_id, vote_type, video_id 
    FROM 
     (
     SELECT count(*) as total_votes, spot_id, video_id, vote_type 
     FROM spot_video_votes 
     GROUP BY spot_id, video_id, vote_type 
     ) AS t 
    GROUP BY spot_id, vote_type 
    ) t2 ON t1.total_votes = t2.max_total_votes 
      AND t1.spot_id = t2.spot_id 
      AND t1.vote_type = t2.vote_type 
+0

非常感谢你! –

+0

+ +1为更好的MYSQL技能比我 –

+0

@GustavoMatias - np,很高兴我可以帮助! – sgeddes

0

尝试增加VIDEO_ID到最后一组由