参考网上的方法,总结了产出重复记录的方法,欢迎交流。

参考:http://www.cnblogs.com/nzbbody/p/4470638.html

方法1:创建一个新表临时储存数据

假设我们有一个存在多个字段的表,表中有部分数据的若干字段重复,此时我们可以使用DISTINCT这个关键字对表数据进行筛选。

 CREATE [TEMPORARY] TABLE temp LIKE origin_tb;
INSERT temp(attr1,attr2,...) SELECT DISTINCT attr1,attr2,... FROM origin_tb;
DELETE FROM origin_tb;
INSERT origin_tb(attr1,attr2,...) SELECT temp * FROM temp;
DROP TABLE temp;

如果全部字段都相同,那么可以直接使用"DISTINCT *"来获取全部字段的记录。这个方法有个问题,就是会改变一条记录中部分字段的值,所以只适用于大部分字段甚至全部字段都重复的记录。并且这种方法创建了一个新的表,效率并不是太高,对于大批量的数据处理,如果使用临时表则要考虑内存占用的问题。

方法二:利用group by分组重复的数据,并提取最小的id进行分组

适用问题:删除重复的记录,只保留编号最小的那条数据,要求每条数据必须要有一个无重复的编号。

 DELETE FROM tb WHERE id NOT IN (SELECT b.mi FROM (SELECT min(id) AS mi FROM tb GROUP BY attr1,attr2...) AS b);

整个过程分成3步:

第一步:利用group by进行查重,提取所有不重复的记录。

第二步:在查重结果的外面进行封装,这是为了避免在查询的同时对表进行更新的问题,mysql不支持这种操作。

第三步:删除重复的记录。

方法二的另一种实现(推荐)

 DELETE a FROM bank_detail_train_cp AS a JOIN (SELECT Uid,`TimeStamp`,TradeType,Volume,`Status`,COUNT(*),MAX(TID) AS TID FROM bank_detail_train_cp GROUP BY Uid,`TimeStamp`,TradeType,Volume,`Status` HAVING COUNT(*)>1) AS b ON
a.Uid=b.Uid AND
a.`TimeStamp`=b.`TimeStamp` AND
a.TradeType=b.TradeType AND
a.Volume=b.Volume AND
a.`Status`=b.`Status`
WHERE a.TID<b.TID;

思路:

第一步:利用GROUP BY和聚合函数MAX()、MIN()、COUNT()对表进行分组聚合,得出所有重复的记录,并抽取其中id值最大(最小)的记录构建临时表;

第二步:对原表与临时表进行内连接,筛选出所有重复的记录,利用WHERE进一步筛选出这些表中id非最大(最小)的记录进行删除。

注释:由于连表操作相对于多次查询来说效率较高,所以建议采用最后一种方法。

   

MySQL删除重复记录的方法的更多相关文章

  1. mysql删除重复记录语句的方法

    例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...

  2. MySQL查询及删除重复记录的方法

    查询及删除重复记录的方法(一)1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select p ...

  3. Mysql删除重复记录,保留id最小的一条

    mysql 查询重复字段,及删除重复记录的方法MySQL, 数据库, 数据库, 字段, 服务器数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较.如果仅仅是查找数据库中name不重复的字段 ...

  4. MySQL中查询、删除重复记录的方法大全

    查找所有重复标题的记录: select title,count(*) as count from user_table group by title having count>1; SELECT ...

  5. mysql 删除重复记录语句

    mysql 根据条件删除重复记录 只保留最小id的重复数据 DELETEFROM newsWHERE news_id IN ( SELECT a.news_id FROM ( SELECT news_ ...

  6. SQL操作语句之查询及删除重复记录的方法

    delete from 表 where id not in(select min(id) from 表 group by name ) //删除重复名字的记录 删除之前请用语句 select * fr ...

  7. MySQL删除重复记录只保留一条

    删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 ...

  8. mysql删除重复记录,只保留最大ID的记录(非重复也保留)

    目前网上搜索的删除重复记录,大部分都是where子查询,本人感觉看上去不美观,故亲自手写了一个,如下: delete from mst_sku using mst_sku,(  select dist ...

  9. mysql删除重复记录语句,删除除了 id 号不同,其他都相同的学生冗余信息

    /** 在Mysql下执行: delete from my.stu where id not in( select min(id) id from my.stu group by code) ; 用途 ...

随机推荐

  1. windows API 统计系统字体

    最近工作中遇到一个需求,需要统计当前系统中包含的所有字体.在网上逛了一圈后发现了EnumFontFamiliesEx这个API好像就可以实现这个功能.这里将自己对这个API的理解做一个记录,算是对这块 ...

  2. 【POJ2985】【Treap + 并查集】The k-th Largest Group

    Description Newman likes playing with cats. He possesses lots of cats in his home. Because the numbe ...

  3. TaskbarCreated 消息

    托盘中的图片就通过注册这个消息来实现,系统和进程通过进程间通信发送这个消息,进程接收他

  4. ARM平台的内核模块编写与安装

       Linux 系统一直在不断地发展,而相应地她的代码量也在不断的增大,直接导致的结果就是她的可执行镜像就变得越来越庞大.那么问题来了,如果将所有的镜像文件一次性地复制到内存中,那么所需的空间就非常 ...

  5. 初探grunt.js

    package.js { "name": "ttd_v3", "version": "0.1.0", "aut ...

  6. ASP.NET Web API下Controller激活

    一.HttpController激活流程 对于组成ASP.NET Web API核心框架的消息处理管道来说,处于末端的HttpMessageHandler是一个HttpRoutingDispatche ...

  7. python【第二篇】列表、元组、字典及文件操作

    本节内容 列表 元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作:列表有序.可变.元素 ...

  8. readline函数分析

    函数功能:提示用户输入命令,并读取命令/****************************************************************************/ /* ...

  9. NSDate 总结日期操作

    IOS Object-c NSDate总结日期操作 //NSDate //1, 创建NSDate对象 NSDate *nowDate = [NSDate date]; NSLog(@"%@& ...

  10. Java中权限修饰符public、private、protected和default的区别

    1.public 可以修饰类.成员变量和成员函数,没有任何限制,同一个包中,或者不同包中的类都可以自由访问 2.private 可以修饰成员变量和成员函数,只能在本类中使用 3.default (不写 ...