在实际应用中,很可能会碰到一些需要删除某些字段的重复记录,我现在把我能想到的写下来,望高手们补充。

1、
具体实现如下:
Table         Create Table                                           
------------  --------------------------------------------------------
users_groups  CREATE TABLE `users_groups` (                          
                `id` int(10) unsigned NOT NULL AUTO_INCREMENT,       
                `uid` int(11) NOT NULL,                              
                `gid` int(11) NOT NULL,                              
                PRIMARY KEY (`id`)                                   
              ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8

users_groups.txt内容:
1,11,502
2,107,502
3,100,503
4,110,501
5,112,501
6,104,502
7,100,502
8,100,501
9,102,501
10,104,502
11,100,502
12,100,501
13,102,501
14,110,501
mysql> load data infile 'c://users_groups.txt' into table users_groups fields
rminated by ',' lines terminated by '/n';
Query OK, 14 rows affected (0.05 sec)
Records: 14  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from users_groups;

query result(14 records)

id uid gid
1 11 502
2 107 502
3 100 503
4 110 501
5 112 501
6 104 502
7 100 502
8 100 501
9 102 501
10 104 502
11 100 502
12 100 501
13 102 501
14 110 501

14 rows in set (0.00 sec)

mysql> create temporary table tmp_wrap select * from users_groups group by uid having count(1) > 1 union all
select * from users_groups group by uid having count(1) = 1;
Query OK, 7 rows affected (0.11 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> truncate table users_groups;
Query OK, 14 rows affected (0.03 sec)

mysql> insert into users_groups select * from tmp_wrap;
Query OK, 7 rows affected (0.03 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> select * from users_groups;

query result(7 records)

id uid gid
1 11 502
2 107 502
3 100 503
4 110 501
5 112 501
6 104 502
9 102 501

mysql> drop table tmp_wrap;
Query OK, 0 rows affected (0.05 sec)

2、还有一个很精简的办法。

查找重复的,并且除掉最小的那个。

delete users_groups as a from users_groups as a,
(
select *,min(id) from users_groups group by uid having count(1) > 1
) as b
 where a.uid = b.uid and a.id > b.id;

(7 row(s)affected)
(0 ms taken)

query result(7 records)

id uid gid
1 11 502
2 107 502
3 100 503
4 110 501
5 112 501
6 104 502
9 102 501

3、现在来看一下这两个办法的效率。

运行一下以下SQL 语句

create index f_uid on users_groups(uid);
explain select * from users_groups group by uid having count(1) > 1 union all
select * from users_groups group by uid having count(1) = 1;

explain select * from  users_groups as a,
(
select *,min(id) from users_groups group by uid having count(1) > 1
) as b
 where a.uid = b.uid and a.id > b.id;

query result(3 records)

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY users_groups index (NULL) f_uid 4 (NULL) 14  
2 UNION users_groups index (NULL) f_uid 4 (NULL) 14  
(NULL) UNION RESULT <union1,2> ALL (NULL) (NULL) (NULL) (NULL) (NULL)  

query result(3 records)

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 4  
1 PRIMARY a ref PRIMARY,f_uid f_uid 4 b.uid 1 Using where
2 DERIVED users_groups index (NULL) f_uid 4 (NULL) 14  

很明显的第二个比第一个扫描的函数要少。

转载于:https://www.cnblogs.com/secbook/archive/2008/04/19/2655305.html

MYSQL中删除重复记录的方法相关推荐

  1. 在SQL中删除重复记录(多种方法) [转]

    学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录.后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录:还可以建临时表来实 ...

  2. MYSQL中删除重复记录

    这是个老生常谈的话题,我们在sql中删除一条重复的记录我们可以[以用户表user为例,包含id,name,value三个字段信息]: delete from 表 where id not in (se ...

  3. 解决Mysql中删除重复记录的问题

    题记 本文主要介绍Mysql数据库表中,如何删除相同索引值.更新日期较早的记录行. 1.相同记录的由来 以Mysql为例,根据表的设计原则,表中不可能存在两条完全相同的记录. 第一范式(1NF):字段 ...

  4. mysql语句中怎么去重复_mysql中删除重复记录sql语句

    在sql中我们经常会碰到有重复的一些数据,下面我来介绍在mysql中删除重复记录的多种方法,有需要的朋友可参考参考. 删除重复记录方法一: 1. 新建一个临时表 代码如下 复制代码 create ta ...

  5. mysql删除重复文章标题_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: 一.查找重复记录 1.查找全部重复记录 2.过滤重复记录( ...

  6. mysql去掉两个最高分_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...

  7. mysql scrapy 重复数据_MySQL大数据量表中删除重复记录

    MySQL大数据量表中删除重复记录 最近工作中需要抓取大量新闻,抓取的数据中由于一些原因存在一些重复数据,而整个数据表的记录数接近10万条,大小接近1个G,又在我自己的渣渣本本上,查询速度十分不理想, ...

  8. MySQL查询重复字段,及删除重复记录的方法

    MySQL查询重复字段,及删除重复记录的方法(转) Submitted by wiley on Thu, 09/03/2009 - 09:36 [教学] MySQL查询重复字段,及删除重复记录的方法 ...

  9. oracle 视图去重复,CSS_Oracle几种查找和删除重复记录的方法总结,平时工作中可能会遇到当试图 - phpStudy...

    Oracle几种查找和删除重复记录的方法总结 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删 ...

  10. 在 MySQL 数据库中删除重复记录的步骤

    在 MySQL 数据库中删除重复记录的步骤 当我们在处理数据库中的数据时,有时候会出现重复记录的情况,这些重复记录会影响数据的正确性,需要将其删除.下面是在 MySQL 数据库中删除重复记录的步骤: ...

最新文章

  1. English in 999
  2. Dom查看数据库mysql_Linux中OS系统和MySQL数据库巡检生成html
  3. c 获得java数据_JNI:如何将一组数据从c转换为Java
  4. 宁波深化智慧城市建设开启智能交通新模式
  5. data-sap-ui-icon-content where does icon content come from
  6. 盘点9 个实用的 JSON 工具
  7. 阿姆斯特朗数_阿姆斯特朗的功能依赖公理 数据库管理系统
  8. 【Jmeter篇】jmeter+Ant+Jenkins实现自动化测试集成(一)
  9. ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘
  10. 剑指offer面试题03. 数组中重复的数字(Array)
  11. React-setState修改状态
  12. document.addEventListener的使用介绍
  13. (转)Android调试运行时错误之Process XXX terminated by signal (11)
  14. 机器学习 流式特征_Web服务与实时机器学习端点的流式传输
  15. 宏碁 Acer AS4738ZG-P622G32Mncc 驱动
  16. 9.5 隐函数求导法则
  17. watermark知识点
  18. 快速傅里叶变换简明教程与实现
  19. php rabbitmq报错重连,README.md · ahming/spring-websocket-example - Gitee.com
  20. Vue Echarts风向折线图拐点生成

热门文章

  1. 计算机科学技术名家讲座许进,论高校计算机科学与技术课程中存在的问题与改革方向.pdf...
  2. java list filter_Java8使用stream().filter()过滤List对象(查找符合条件的对象集合)
  3. 新员工不继续试用,这事怪谁?
  4. 管理新语:依照员工能力,可以分为飞天型、登山型、平路型
  5. MAC编译OpenJDK8:ld: library not found for -lstdc++(独家解决办法)
  6. LINUX下载编译OpenSSL
  7. LINUX虚拟机安装增强功能时报错:/sbin/mount.vboxsf: mounting failed with the error: No such device
  8. 大群就是公共场所,不要有事就在大群说
  9. 对手机彩铃的一些想法
  10. 进入32位保护模式之路