mysql 查询,如何使用 GROUP_CONCAT 获得前 5 名下载

Posted

技术标签:

【中文标题】mysql 查询,如何使用 GROUP_CONCAT 获得前 5 名下载【英文标题】:mysql query, how can i get top 5 downloads with GROUP_CONCAT 【发布时间】:2014-01-25 03:56:55 【问题描述】:

mysql 表中的以下数据。

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  

如何在每个品牌中找到具有 GROUP_CONCAT 功能的前 5 位图片 我想跟随返回

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

我在表和brand_id、image_id 中有大量数据,大约有200 万条记录,每次用户下载时都会重复,所以当我运行查询时出现以下错误

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

我认为超出了 GROUP_CONCAT 范围, 能否请您提供解决方案,所以我只能获得每个品牌的前 5 名下载,因此不需要 SUBSTRING_INDEX 函数。

谢谢

【问题讨论】:

为什么要使用 GROUP_CONCAT? 我想要前 5 个图像 id 用逗号分隔每个品牌,有什么办法请提供给我 如果第五名的图片与另一张图片并列怎么办? 取无关紧要的平局的第一个结果.. 【参考方案1】:

试试这个:

SELECT brand_id, GROUP_CONCAT(image_id) image_ids
FROM (SELECT brand_id, image_id, 
             IF(@lastBrandId = @lastBrandId:=brand_id, @Idx:=@Idx+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

【讨论】:

我知道微不足道,但 OP 想要 2959,而不是 2976!所以 ORDER BY brand_id,下载 DESC,image_id

以上是关于mysql 查询,如何使用 GROUP_CONCAT 获得前 5 名下载的主要内容,如果未能解决你的问题,请参考以下文章

如何提高mysql查询速度

MYSQL索引问题:索引在查询中如何使用?

mysql 如何使用sql查询某一个表的表头

Mysql查询-如何使用包含?

如何使用索引快速提高 mysql 查询?

sql mysql多表如何关联查询