Mysql5.7版本中,查询分组GROUP BY通过子查询中ORDER BY进行排序无效的问题解决办法

前言:使用场景,查询用户所访问的同一个客服的列表,但是存在多次访问的情况,这时候就需要使用分组,获取客户访问的所有客服。且通过子查询提前将交互时间(最后一次访问客服时间)进行排序

(1)客服服务日记表

CREATE  TABLE `kefu_service_log` (

`id` int(11) NOT  NULL  AUTO_INCREMENT,

`kefu_id` int(11) DEFAULT  NULL,

`user_id` int(11) DEFAULT  NULL,

'created_at' timestamp DEFAULT  NULL,

PRIMARY  KEY (`id`)

) ENGINE=InnoDB DEFAULT  CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

(2)我们对 kefu_id 进行分组,按 created_at 从大到小排序:

SELECT  *  FROM `kefu_service` GROUP  BY kefu_id ORDER  BY created_at

直接使用 group by 查出来的数据是按 id 顺序分组的,并未达到预期

(3)尝试使用子查询,先排序再分组

SELECT * FROM ( SELECT  *  FROM `kefu_service_log` ORDER  BY created_at ) AS k GROUP  BY kefu_id

    注意:这个方式在低版本中有效。在 5.7 版本中引入新特性 derived_merge 优化过后无效了。

(4)处理方式:

那么我们可以将上面的那条 sql 语句使用 having 来阻止合并:

SELECT * FROM ( SELECT  *  FROM `kefu_service_log` HAVING  1=1  ORDER  BY start_time ) AS k GROUP  BY kefu_id;