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

本文探讨了在MySQL数据库中如何处理用户访问客服的列表,特别是当存在多次访问时,如何正确地按客服分组并按交互时间排序。原始SQL语句在高版本中由于derived_merge优化失效,导致结果不正确。解决方案是使用HAVING子句来避免优化合并,确保先排序后分组,从而得到预期的结果。
摘要由CSDN通过智能技术生成

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

(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;

 

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值