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

参考: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. 【转】WF4.0实战系列索引

    转自:http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html 此系列的工作流文件案例比较多点,实用性好. W ...

  2. php 备份数据库脚本

    <?php// 备份数据库$host = "localhost";$user = "root"; //数据库账号$password = "123 ...

  3. print 函数的进一步理解

    没有括号的时候,pritn是列表操作符,会把其后列表里所有东西都数出来. 但是假如print后面紧跟着左括号,它就是一个函数调用,只会将括号内的东西输出来. “假如它看起来像函数调用,它就是一个函数调 ...

  4. 一句实现jquery导航栏

    /*mine 才疏学浅,望大神绕行 */ .current{ color: red; font-size: large; } $(function(){ //实现点击标题的css和.lev1下面的a标 ...

  5. 在静态页面html中跳转传值

    在html中通过"?"传值--------<a href="index2.html?name=caoy">静态传值</a> 在跳转到的页 ...

  6. scons小结

    scons是用python写的,据说是比make要方便很多,其实我都没写过makeFile...... 1.安装 方式1:下载安装包安装,需要用python setup.py install去编译 方 ...

  7. nginx 环境搭建使用之入门

    1.http://nginx.org/下载最新的nginx 现在最新的版本是nginx-1.9.1   下载.tar.gz包 ,解压. timeless@timeless-HP-Pavilion-g4 ...

  8. YII框架的部署 通过YII脚手架程序创建应用程序系统

    1,把YII框架里面的framework复制粘贴到nginx目录下 2,创建一个商城系统: 1)修改环境变量 制定php.exe的目录 2)C:\Users\Administrator>cd C ...

  9. TatukGIS - GisDefs - ColorToHSL 过程

    过程名称  ColorToHSL 所在单元  GisDefs 过程原型           procedure ColorToHSL(const _color: TColor; var _h: Rea ...

  10. FASTMM,FASTCODE,FASTMOVE请移步

    http://blog.csdn.net/akof1314/article/details/6524767