Mysql5.7中子查询时order by与group by合用无效的解决办法
   2019-06-12 13:59:25
group by总是会取得分组的第一条记录,我们对分组的记录进行一下调整就能取到想要的数据,如:取得每个部门最高薪水的人 数据表:
CREATE TABLE `staff` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`salary` int(10) DEFAULT NULL,
`dept` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用SQL:SELECT * FROM (SELECT * FROM staff ORDER BY salary DESC) a GROUP BY dept 上面这句SQL是没有错误的,
但是我们发现他拿不到我们想要的数据,似乎order by子查询得到的表中的数据并没有在外部查询中起作用,但是:mysql 5.7 中 ,
这种语法并没有效果,正确的写法是:
SELECT * FROM (SELECT * FROM staff ORDER BY salary DESC LIMIT 0,999) a GROUP BY dept
重点就是LIMIT部分,通过 explain 查看执行计划,可以看到没有 LIMIT 的时候,少了一个 DERIVED 操作。DERIVED用于派生表的SELECT
(FROM子句的子查询),所以没有它就相当于子句里的排序并没有被执行。