mySQL:每种类型仅显示 4 条记录,按类型分组

标签 mysql group-by distinct

我有 2 列名称和类型:

Name    | Type
==================
sam     | Blue  
john    | red  
jones   | Blue  
troy    | red  
dan     | red  
ben     | Blue  
joy     | Blue  
jim     | green  
tom     | red  
edi     | green  
frank   | green  
tony    | green  
jimmy   | red  

如何使用 mySQL 为每个类型提取 4 行,按类型分组,按类型排序?
我的最终结果应该如下所示:

Name    | Type
==================
sam     | Blue   
jones   | Blue  
ben     | Blue  
joy     | Blue 
edi     | green  
frank   | green  
tony    | green  
jim     | green  
john    | red     
troy    | red  
dan     | red  
tom     | red  

最佳答案

我建议有两种选择:

A) 使用 MyISAM 引擎并应用自动增量功能,但这涉及使用额外的表来进行临时存储:

CREATE TEMPORARY TABLE UserLikes(
Type varchar(20) ,
name varchar(20),
ranking int AUTO_INCREMENT,
likes int,
PRIMARY KEY ( type, ranking  )
) ENGINE=MyISAM;

INSERT INTO UserLikes
SELECT 
Type,
Name,
null AS ranking,
count(*) AS likes
FROM 
YourTable
GROUP BY Type, Name 
ORDER BY Type, likes DESC;

SELECT * FROM UserLikes WHERE ranking <= 4;

B) 另一种方式不需要任何权限,除了选择访问权限 授予,但随着表增长得太多,它会挂起:

SET @ranking = 0;
SET @currType = space(20);

SELECT 
    Types,
    Name,
    @ranking := IF( Type != @currType , 0 , @ranking + 1 ) AS ranking,
    @currType := Type,
    likes    
 FROM
(
   SELECT 
       Type,
       Name,
       null AS ranking,
       count(*) AS likes
   FROM 
       YourTable
   GROUP BY Type, Name,
   ORDER BY Type, likes DESC
) AS staging
HAVING ranking <= 4
;

我希望这对你有帮助。

关于mySQL:每种类型仅显示 4 条记录,按类型分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37126565/

相关文章:

php - 如果列不存在,Mysql 选择另一个表

mysql - MySQL 中的作用域/复合代理键

mysql - 高频更新、表插入、多路同时访问

mysql - 如何计算已执行的 SQL 查询的不同结果?

php - 显示可能通过 HTTP POST (PHP + MySQL) 更改的项目列表的最佳做法是什么

MySQL 按组对记录进行编号 - 我遇到错误了吗?

c# - 如何使用 Linq 对每 N 行进行分组

mysql - SELECT 列表不在 GROUP BY 子句中且包含非聚合列;这与 sql_mode=only_full_group_by 不兼容

MySQL Distinct/Group by,这个让我头疼

laravel-5 - laravel 使用 Distinct Eloquent 关系