我有 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/