MySQL之如何删除重复数据只保留一条

背景:task表中保存有车的代办工单的数据,因为历史原因,该数据表中保存有同一个车同一个status的多条数据,现在需要将历史数据都删掉,只保留同一个车同一个状态下的最新一条记录即可,那么这个sql该怎么写呢?

实现这个需求,我们先要了解几个MySQL的函数:

第一个函数是group by和group_concat。group_concat的作用是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。因为我们是想获取非最新的数据id,然后根据id将数据进行删除。我们可以结合group_concat和order by实现目的,当然order by不是放在where之后,而是放在group_concat的括号里面(此处如果放在where的后面,是没有排序效果的)。

第二个函数,如果有字符串是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 ASC

eeda4237692448136daddba86eb9e0d199c.jpg

结果集ids即排除了最新一条数据id,剩下我们将要删除的ids,直接根据id执行删除操作就可以了。

转载于:https://my.oschina.net/guquanxin/blog/3044375

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值