背景:task表中保存有车的代办工单的数据,由于历史缘由,该数据表中保存有同一个车同一个status的多条数据,如今须要将历史数据都删掉,只保留同一个车同一个状态下的最新一条记录便可,那么这个sql该怎么写呢?sql
实现这个需求,咱们先要了解几个MySQL的函数:函数
第一个函数是group by和group_concat。group_concat的做用是将group by产生的同一个分组中的值链接起来,返回一个字符串结果。由于咱们是想获取非最新的数据id,而后根据id将数据进行删除。咱们能够结合group_concat和order by实现目的,固然order by不是放在where以后,而是放在group_concat的括号里面(此处若是放在where的后面,是没有排序效果的)。blog
第二个函数,若是有字符串是123,456,789,若是我想获取第一个逗号之后的内容,该怎么办,这时候咱们要用到LOCATE和SUBSTRING函数,例如:SELECT SUBSTRING('123,456,789',LOCATE(',','123,456,789')+1),结果为456,789。补充一下,若是想获取逗号以前的内容能够使用SUBSTRING_INDEX函数,示例为:SELECT SUBSTRING_INDEX('111,222,333,444,555,666',',',3),结果为获取第三个逗号以前的内容,即111,222,333排序
下面开始整合sql:字符串
SELECT
SUBSTRING(GROUP_CONCAT(id ORDER BY created_at DESC), LOCATE(',', GROUP_CONCAT(id ORDER BY created_at DESC)) + 1) AS ids,
GROUP_CONCAT(id ORDER BY created_at DESC) AS groupIds, GROUP_CONCAT(created_at) AS groupCreatedAt,
carId, COUNT(*) AS num
FROM
task
WHERE
type = 410 AND is_deleted = 0 AND status = 11
GROUP BY
carId
HAVING
num > 1
ORDER BY id ASCim
结果集ids即排除了最新一条数据id,剩下咱们将要删除的ids,直接根据id执行删除操做就能够了。数据