MySQL 根据某字段分组,再根据另一字段排序,取每个组内的前 n 条数据

建表

1
2
3
4
5
6
CREATE TABLE `tmp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`point` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

查询 SQL

根据 name 字段进行分组,并取每个分组中 point 最大的 n 条记录:

1
SELECT a.* FROM tmp a WHERE n > ( SELECT count( * ) FROM tmp b WHERE b.name = a.name AND b.point > a.point )

测试

假如现在有数据:

id name point
1 张三 60
2 张三 80
3 张三 90
4 张三 95
5 李四 74
6 李四 95
7 李四 82
8 李四 100

想要的结果是: 获得张三和李四 point 较大的前两条记录

执行 SQL ==>

1
SELECT a.* FROM tmp a WHERE 2 > ( SELECT count( * ) FROM tmp b WHERE b.name = a.name AND b.point > a.point )

获得结果 ==>

id name point
3 张三 90
4 张三 95
6 李四 95
8 李四 100