引言:
今天同事翻看之前我写的sql时,问我我这个sql和他写的相比查询效率哪个更好。乍眼一看,竟然没看懂他写的sql,(⊙﹏⊙)b汗。仔细一看,还真是很巧妙,必须要研究研究!
所以便有了本篇内容:mysql如何先查询后分组(求每个分组的 top1)
问题重现:有这样一个需求,需要查询每个分组的某个字段最新(最大)对应的整条记录。举个栗子:假如有个员工表,有id(主键),salary(薪水),depart_id(部门id),求出每个部门薪水最高的员工记录。
实现:
在这之前,我所知道比较简单明了的实现有下面这两种(为了简单,我创建了一个测试表,只包含排序字段和分组字段)
以下是建表语句
DROP TABLE IF EXISTS `sort_group`;
CREATE TABLE `sort_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sort` int(11) DEFAULT NULL,
`gp` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
insert into `sort_group`(`id`,`sort`,`gp`,`name`) values (1,1,1,'我是sort1,gp1'),(2,1,2,'我是sort1,gp2'),(3,2,1,'我是sort2,gp1'),(4,2,2,'我是sort2,gp2');
表中的数据:
第一种实现:(先按正确的排序查询出的结果作为子查询,然后以子查询的结果集再分组,就会只剩下每个分组的第一条记录