2014-01-07 31 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個字節)。爲這個變量設置一個更高的值。