刪除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)


 

            

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