一条语句删除数据库中的重复记录(数据量较大,百万级数据,注意性能问题)

此类问题比较常见,在平常的开发当中,如何使用一条语句就能够做到呢? 并且效率还要很快,下边给出一种删除重复数据保留一条的方案. 希望大家有好的思路可以评论分享.这边为了方便理解,给出我本地使用的sql案例,方便大家测试和修改

首先说下思路:

  1. 把重复数据查出来作为一个临时表temp
  2. 保留一组重复数据中主键id最小的记录(删除的时候要用)
  3. 两个表连接进行删除操作,删除Where条件:重复条件相同,并且id>min(id)

数据表字段及说明

consum_record表数据及结构下载
表结构如下:

id主键,注意重复的列为user_id(用户id),monetary(消费金额),consume_time(消费时间),也就是说,同一个顾客同一个时间消费金额数是不可能存在多条数据的, 我们要对数据库中记录坐下排重

其中摘录出来几条重复数据供大家理解题设

id user_id monetary consume_time consume_type
2552 321 4 1495075537 1
2553 321 4 1495075537 1
2554 321 4 1495079932 1
2555 111 6 1495079932 1
2556 111 6 1495079932 1
2557 156 12 1495079939 1
2558 156 12 1495079939 1
2559 156 12 1495079939 1

SQL展示

DELETE consum_record
FROMconsum_record, (SELECTmin(id) id,user_id,monetary,consume_timeFROMconsum_recordGROUP BYuser_id,monetary,consume_timeHAVINGcount(*) > 1) temp
WHEREconsum_record.user_id = temp.user_id and consum_record.monetary = temp.monetaryand consum_record.consume_time  = temp.consume_time
AND consum_record.id > temp.id;

思路:

  • 首先就是将user_id,monetary,consume_time这三个字段进行group by,将count(*)>1筛选出来

min(id) id 每个重复组当中的最小id很关键,删除数据的时候做筛选使用 也可以使用max(id)

        SELECTmin(id) id,#每个重复组当中的最小id很关键,删除数据的时候做筛选使用 也可以使用max(id)user_id,monetary,consume_timeFROMconsum_recordGROUP BYuser_id,monetary,consume_timeHAVINGcount(*) > 1
  • 接下来使用基础表,和查出来的重复数据做关联(根据三个重复字段做关联), 然后根据每组重复数据consumer_record.id> temp.id 删除相应数据

总结:

要深刻理解group by的原理, 根据相应的条件分组

删除的时候temp表其实就是作为一个筛选条件而存在的表,这时候可以两个表做关联筛选出需要的行

MySQL一条语句去重留一相关推荐

  1. MySQL 一条语句实现若记录存在则更新,不存在则插入

    MySQL 一条语句实现若记录存在则更新,不存在则插入 问题产生 博主相信很多人在开发的时候难免会出现需要先判断某个记录是否存在,存在则更新,不存在则插入新记录的情况(如在填写报名表的时候有用户需要修 ...

  2. mysql case quchong_处理mysql的查询语句去重案例一则

    有一个网友在QQ群中问到: 各位,这条语句还能加个去重不? SELECT cc.customer_id   as userId,cc.content as content,        cc.log ...

  3. mysql一条语句是如何被执行的——带你了解mysql语句执行内部顺序

    文章目录 写在前面 MySQL基本架构 超详细架构图 连接器 查询缓存 解析器 MySQL 8.0对Parser所做的改进 优化器 执行器 存储引擎 SQL语句执行时间分析 参考资料 写在前面 sel ...

  4. MySQL一条语句算出中位数

    起因:数据库里有商品在不同地区,不同时间段,不同渠道的销售价格,想取个平均值.但因为数据是各个网点统计上来的,有个别错列了,导致有的价格失真(像一盒糖卖几万块,但实际是错列了,几万是商品编号).因为数 ...

  5. MySQL与SQLServer的区别(一千条语句)

    ER图.分页.差异.Java连接MySQL SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 ...

  6. mysql执行一条语句会加锁吗_一条简单的更新语句,MySQL是如何加锁的?

    看如下一条sql语句: # table T (id int, name varchar(20)) delete from T where id = 10: MySQL在执行的过程中,是如何加锁呢? 在 ...

  7. mysql update from 语句_MySQL高频面试题01期:一条update语句的生命历程

    在有关 MySQL 的面试时,是不是曾经有被问到过:一条 update 语句的生命历程是怎样的?今天就来聊聊这一面试题. 这篇文章通过这条语句进行讲解: update test set a=5 whe ...

  8. mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?

    这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Server,接 ...

  9. mysql几条相同的数据删除只留一条id最大的数据

    mysql几条相同的数据删除只留一条id最大的数据 delete from user where REPAIR_PRODUCT_ID = #{repairProductId} order by ID ...

最新文章

  1. 记单词 - soil
  2. 思科服务器型号m1414,Cisco UCS M 系列模块化服务器
  3. selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫
  4. 针对新手的Java EE7和Maven项目-第4部分-定义Ear模块
  5. SSM 框架整合 spring 发送邮件功能实现!
  6. word删除分节符后之前的格式乱了_分页符分节符,你知道多少
  7. Virtualenv 相关
  8. 定时器翻转io口的好处_STM32 定时器输出比较翻转模式
  9. Git和SourcesTree的安装
  10. 阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门
  11. ios 8 适配须知
  12. 使用 Laravel 5.5+ 更好的来实现 404 响应
  13. Rstudio 设置工作路径
  14. python mp4提取音频_Python从视频文件中提取wav
  15. 可靠性测试的定义、测试点及用例设计方法
  16. 圆跳动基础知识(几何公差)
  17. cocos2dx掼蛋_cocos2d/x 自带字体(label)
  18. EXCEL多页打印时,上边框线无法显示
  19. 小米13,红米K6,vivo S16,一加11,IQOO11安装谷歌Play商店,安装框架服务谷歌Google
  20. 喷淋系统在安装算量软件中如何计算工程量?

热门文章

  1. [渝粤教育] 西南科技大学 证券投资学 在线考试复习资料
  2. 首款保证续保15年的产品——太平洋保险安享百万医疗保险好不好?优缺点详细分析来了!
  3. 空间直角坐标系、大地坐标系、平面坐标系、高斯平面直角坐标系(转)
  4. 手工去掉迅雷最新版5.9.15.1274广告
  5. 解答篇:金蝶K3WISE15.0-生产投料单公式详解
  6. Gauss-integration
  7. useCallback性能优化及其闭包陷阱
  8. libminimsgbus集成消息通讯库(多协议订阅发布)
  9. SMAPI Mod制作思路
  10. java 电信号码,java兑现移动,联通,电信手机号码的验证