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