2014-01-07 27 views
4

以下数据在MySql表中。mysql查询,我怎样才能得到前5名下载与GROUP_CONCAT

brand_id|image_id|downloads 
--------|--------|--------- 
8  |9  |8  
35  |2829 |4  
28  |2960 |3  
28  |2961 |3  
28  |3041 |3  
35  |2831 |3  
28  |2965 |3  
35  |2832 |3  
28  |2959 |2  
28  |2976 |2  
35  |2894 |2 

我怎样才能找到前5名的图像与GROUP_CONCAT功能在每个品牌 ,我想对以下返回

brand_id|image_ids     
--------|-------------------------- 
8  |9      
35  |2829,2831,2832,2894  
28  |2960,2961,3041,2965,2959 

下面的查询提供了预期的结果

SELECT brand_id, SUBSTRING_INDEX(GROUP_CONCAT(image_id SEPARATOR ','),',',5) AS image_ids 
FROM Table1 
GROUP BY brand_id 

我有大量的数据约2MILION记录在表和brand_id,image_id都重复与每个用户下载,所以当我运行查询我得到foll由于错误

MySql Error: %d line(s) were cut by GROUP_CONCAT() 

我觉得GROUP_CONCAT超出范围, 可以请你提供的解决方案,所以我有只获取每个品牌前五名下载所以不需要SUBSTRING_INDEX功能。

谢谢

+0

为什么要使用GROUP_CONCAT? – Strawberry

+0

我想要排名前5的图像ids逗号分开与每个品牌,有没有什么办法请给我 – Girish

+0

如果第五位的图像与另一个图像绑在一起怎么办? – Strawberry

回答

5

试试这个:

SELECT brand_id, GROUP_CONCAT(image_id) image_ids 
FROM (SELECT brand_id, image_id, 
      IF(@lastBrandId = @lastBrandId:=brand_id, @Idx:[email protected]+1, @Idx:=0) rowNumber 
     FROM Table1, (SELECT @lastBrandId:=0, @Idx:=0) A 
     ORDER BY brand_id, downloads DESC 
    ) AS A 
WHERE rowNumber < 5 
GROUP BY brand_id 
+0

琐碎我知道,但OP要2959,而不是2976!所以ORDER BY brand_id,下载DESC,image_id – Strawberry

0

好像GROUP_CONCAT产生字符串的长度大于group_concat_max_len(默认= 1024个字节)。为这个变量设置一个更高的值。