mysql 分组后 排序_mysql中的先排序后分组

引言:

今天同事翻看之前我写的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');

表中的数据:

mysql 分组后 排序_mysql中的先排序后分组_第1张图片

第一种实现:(先按正确的排序查询出的结果作为子查询,然后以子查询的结果集再分组,就会只剩下每个分组的第一条记录,以为子表是正确排序的,所以子表的每个分组的第一条记录就是想要的结果)

SELECT a.id,a.sort,a.gp,a.name FROM (

SELECT * FROM sort_group ORDER BY sort DESC

) a

GROUP BY a.gp

这种实现很好理解,按照语义就是先查询后排序。但是仔细一看,可以看出一点问题。用了分组查询,查的字段却没有都

你可能感兴趣的:(mysql,分组后,排序)