mysql 删除重复数据保留一条
验证:mysql 5.6版本
方法一:
delete a from table a left join( 
select (id) from table  group by studentName,classId) b on a.id=b.id where b.id is null;
方法二:
explain delete from table where id not in (select minid from (select min(id) as minid from table group by studentName,classId) b);
方法三:参考:http://www.cnblogs.com/nzbbody/p/4470638.html
1、创建一个临时表,选取需要的数据。
2、清空原表。
3、临时表数据导入到原表。
4、删除临时表。
mysql> select * from student;
+----+------+
| ID | NAME |
+----+------+
| 11 | aa |
| 12 | aa |
| 13 | bb |
| 14 | bb |
| 15 | bb |
| 16 | cc |
+----+------+
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
Query OK, 0 rows affected
mysql> insert into student select * from temp;
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
+----+------+
| ID | NAME |
+----+------+
| 11 | aa |
| 13 | bb |
| 16 | cc |
+----+------+
3 rows in set
mysql> drop temporary table temp;
Query OK, 0 rows affected
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
mysql> create temporary table temp as select min(id) as MINID from student group by name;
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
Query OK, 3 rows affected
mysql> select * from student;
+----+------+
| ID | NAME |
+----+------+
| 11 | aa |
| 13 | bb |
| 16 | cc |
+----+------+
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
怎么规避这个问题?
再加一层封装,如下:
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
Query OK, 3 rows affected
mysql> select * from student;
+----+------+
| ID | NAME |
+----+------+
| 11 | aa |
| 13 | bb |
| 16 | cc |
+----+------+
3 rows in set
mysql 删除重复数据保留一条的更多相关文章
- SQL server 存储过程  C#调用Windows CMD命令并返回输出结果  Mysql删除重复数据保留最小的id   C# 取字符串中间文本 取字符串左边 取字符串右边  C# JSON格式数据高级用法
		create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ... 
- Mysql删除重复数据保留最小的id
		在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GR ... 
- mysql 删除重复数据保留只保留一条
		SELECT * FROM (SELECT addTime FROM motorcade.car_msg_info GROUP BY addTime HAVING COUNT(addTime) > ... 
- sql 删除重复数据保留一条
		--创建测试表 CREATE TABLE TEST ( DEPTNO ), DNAME ), LOC ) ); --插入测试数据 , 'test1', 'test2'); , 'test1', 'te ... 
- sql server删除重复数据,保留第一条
		SELECT * FROM EnterpriseDataTools.Enterprise.CompanyMainwhere CompanyNo in (select CompanyNo from En ... 
- mysql删除重复数据只保留一条
		mysql删除重复数据只保留一条 新建一张测试表: CREATE TABLE `book` ( `id` char(32) NOT NULL DEFAULT '', `name` varchar(10 ... 
- mysql 删除重复数据只保留一条记录
		删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ... 
- mysql删除重复数据,保留最新的那一条
		因为数据库没键外键,在关联查询的时候,会碰到查询条数多余数据库实际条数,这因为关联字段在表中有重复值而导致的. 解决方案: 1.数据库脚本删除重复数据,保留最新的一条 2.对关联字段增加唯一约束 例如 ... 
- mysql 删除重复数据,并保存最新一条数据
		删除重复行 DELETE FROM ecm_member_login_session WHERE (number , client_code) IN ( ) AND update_time NOT I ... 
随机推荐
- 再叙TIME_WAIT
			之所以起这样一个题目是因为很久以前我曾经写过一篇介绍TIME_WAIT的文章,不过当时基本属于浅尝辄止,并没深入说明问题的来龙去脉,碰巧这段时间反复被别人问到相关的问题,让我觉得有必要全面总结一下,以 ... 
- laravel----------------自动生成模型,控制器,视图的操作步骤。
			首先要阅读这篇文章,你一定已经掌握了composer 和 artisan . 第一步,打开https://packagist.org/这个网址,在搜索框内输入way/generators 如图 第二步 ... 
- 读取input:file的路径并显示本地图片的方法
			<!doctype html> <html> <head> <meta content="text/html; charset=UTF-8" ... 
- (九)串行口方式0 拓展并行输出端口 02    74LS164芯片
			1.先讲解74LS164 移位芯片: 74HC164.74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出. 数据通过两个输入端(DSA 或 DSB)之一串行输入:任一输入端可 ... 
- [Ubuntu] Profile error when launching google-chrome
			Whenever I launch google-chrome, a window is displayed which contains this message: Your profile cou ... 
- CentOS7下安装Mysql和Memcached 以及 使用C#操作Mysql和Memcached
			我本身是学.net的,但是现在很多主流SQL和NOSQL都是部置在linux下,本着好学的精神,前段时间装了个虚拟机,在其装上CentOS64位的服务器系统,对于英文0基础,linux0基础的我来说, ... 
- 单点登录 SSO 的实现原理
			单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任. 单点登录在大型网站里使用 ... 
- Linux 批量改名之 rename 命令
			刚学习到 rename 命令功能很强大,比win 下的 ren 厉害啊 具体看 man rename 语法: rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ - ... 
- javascript百度地图添加一个普通标注点(2014-3-8 记)
			1.导入jquery.js文件:<script type="text/javascript" src="js/jquery.js"></scr ... 
- (转)mysql中InnoDB表为什么要建议用自增列做主键
			InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ... 
