删除mysql 表中重复的记录


额,,这个很恶心人,,可能是刚开始弄这些玩意不习惯.....


要求:有一张表 user , 有三个字段  id     name   age   

             需要把表中 name 和 age 相同的记录删掉,并且要留一个....

mysql> select * from user;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | aa      |   24 |
|  2 | aa      |   24 |
|  3 | aa      |   24 |
|  4 | aaa     |   24 |
|  5 | dfdaa   |   23 |
|  6 | dfdfdaa |   23 |
|  8 | aaa     |   24 |
|  9 | dadfdaa |   23 |
+----+---------+------+
8 rows in set (0.00 sec)


思路:查到所有重复的记录   暂时存在 tmp 临时集合里     带 id [所有的重复的记录id]

             查到在表里有重复记录的数据,暂时存放起来   带 id [有重复记录的数据 id ,同样的记录只留一个 id]

             两个tmp 对比,第二个 tmp中没有的id就是需要删掉的


语句:

delete from `user` where `name` in (select tmp.`name` from (select id,name from user a where(a.name,a.age) in (select name,age from user group by name,age having count(*)>1)) tmp) and id not in (select tmp.id from ( select `name`,id from `user` where 1=1 group by `name`,`age` having count(*) > 1) tmp);

好像sql语句写在代码框里会显示不完整,补下面:


 sql = delete from `user` where `name` in (select tmp.`name` from (select id,name from user a where(a.name,a.age) in (select name,age from user group by name,age having count(*)>1)) tmp) and id not in (select tmp.id from ( select `name`,id from `user` where 1=1 group by `name`,`age` having count(*) > 1) tmp);


结果:

mysql> select * from user;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | aa      |   24 |
|  4 | aaa     |   24 |
|  5 | dfdaa   |   23 |
|  6 | dfdfdaa |   23 |
|  9 | dadfdaa |   23 |
+----+---------+------+
5 rows in set (0.00 sec)

如果需要把有重复的数据全部删掉,不留下最后一个,可以执行语句:

delete from user where name in (select tmp.name from ( select name,id from user group by name having count(name) > 1) tmp);


语句:

select tmp.`name` from ( select `name`,`id` from `user` group by `name`,`age` having count(*) > 1) tmp) ;

执行结果会是删掉表中有重复name的所有记录

改变一下昨天的思路,上面的方法执行起来速度太慢了......

思路:

   因为要保留一个,为了保留最新的记录,所以保留重复记录中 id 最大的

   用user表里所有有重复的记录 id 跟重复Id 中的最大值做对比,

   小于这个最大值的Id就是需要删除的记录 id  ,因为数据库不允许同时select和delete同一张表, 所以临时存在一张 tmp表里

   从 tmp里查出 id 在user 表里删除对应的记录  

   删除 tmp 表,,,完成

user表里的记录

mysql> select * from user;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | aa      |   24 |
|  2 | aa      |   24 |
|  3 | aa      |  224 |
|  4 | aaa     |   24 |
|  5 | dfdaa   |   23 |
|  6 | dfdfdaa |   23 |
|  7 | aa      |   24 |
|  8 | aaa     |   24 |
|  9 |adfdaa   |   23 |
| 10 |  aaa    |   34 |
+----+---------+------+
9 rows in set (0.00 sec)

1.查询一下需要删除的 id

  语句:

select * from `user` AS A where `id` < (select max(`id`) from `user` AS B where A.`age`=B.`age` AND A.`name`=B.`name`);

 结果:

mysql> select * from user a where id < (select max(id) from user b where a.name=b.name and a.age=b.age);
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | aa   |   24 |
|  2 | aa   |   24 |
|  4 | aaa  |   24 |
+----+------+------+
3 rows in set (0.00 sec)

2. 分三步删除记录

 --------- 

mysql> create table tmp as select * from `user` A where `id` > (select min(`id`) from `user` B where A.`age`=B.`age` AND A.`name`=B.`name`);
drop table tmp;Query OK, 3 rows affected (0.30 sec)
Records: 3  Duplicates: 0  Warnings: 0

 ---------

mysql> delete from `user` where `id` in(select `id` from tmp);
Query OK, 3 rows affected (0.05 sec)

 ----------

mysql> drop table tmp;
Query OK, 0 rows affected (0.09 sec)


ok,删除完成,查看下结果

mysql> select * from user;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  3 | aa      |  224 |
|  5 | dfdaa   |   23 |
|  6 | dfdfdaa |   23 |
|  7 | aa      |   24 |
|  8 | aaa     |   24 |
|  9 | dadfdaa |   23 |
| 10 | aaa     |   34 |
+----+---------+------+
7 rows in set (0.00 sec)


 

            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章