额,,这个很恶心人,,可能是刚开始弄这些玩意不习惯.....
要求:有一张表 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)