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

标签 mysql sql select group-concat top-n

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

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

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

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

谢谢

最佳答案

试试这个:

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

关于mysql 查询,如何使用 GROUP_CONCAT 获得前 5 个下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20972119/

相关文章:

css - 如何删除 Internet Explorer 8 IE8 中的默认下拉箭头?

php - 是否可以在 MySQL General/Slow Query Logs 中隐藏密码?

mysql - 如何在mysql workbench中打开多个模型/数据库

mysql - 获取mysql表的总和并加入另一个表以获取名称

从两个不同的数据库(同一服务器)中的 2 个不同的表中选择的 SQL 语句

select - 无法在 slickgrid 中使用选择下拉插件

sql - 在 MySQL 中有 1 个大表还是 2 个小表更好?

sql - 连接中的替换和点赞

sql - 带有总和和条件的 PostgreSQL 查询

javascript - 保留选定倍数的值并使用它们创建表 jQuery