額,,這個很噁心人,,可能是剛開始弄這些玩意不習慣.....
要求:有一張表 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)