MySQL 一条SQL语句删除重复记录
不正确的写法一。
delete from t_user where id in(select max(id) as id from t_user group by username );
但是mysql不支持这个写法(别的db是不是支持,没有测试),报错:
ERROR 1093 (HY000): You can't specify target table 't_user' for update in FROM clause
原因大概是删除的同时,不能查询自己,跟程序的foreach循环过程中不能删除类似
不正确的写法二。
delete t_user
from t_user as t_user, (select id from t_user group by username having count(*) > 1) as t2
where t_user.id=t2.id;
这个的原理是删除重复的,但这个算法只对重复个数是2的管用,一旦重复数是3等,就不能惯用了。
正确的方法一。
--这个算法的原理是:group但不会count,这样在temp_table中的就是最终要留下来的结果,把其他的删除就ok了
--另外,这里利用了temp table,避免了上面foreach不能删除的问题
delete t_user
from t_user
where id not in (
select id from (select id from t_user group by username) as temp_table
);
正确的方法二。
算法同上,只是可以不用group,用distinct
略
例子:
--表
drop table t_user;
create table t_user(
id int(5) not null auto_increment,
username varchar(10),
age int(3),
primary key(id)
);
--插入
insert into t_user(username,age) values('aaa',20);
insert into t_user(username,age) values('aaa',20);
insert into t_user(username,age) values('bbb',20);
insert into t_user(username,age) values('bbb',20);
insert into t_user(username,age) values('bbb',20);
insert into t_user(username,age) values('ccc',20);
insert into t_user(username,age) values('ccc',20);
insert into t_user(username,age) values('ccc',20);
insert into t_user(username,age) values('ccc',20);
insert into t_user(username,age) values('e',10);
insert into t_user(username,age) values('f',5);
--删除
delete t_user
from t_user
where id not in (
select id from (select id from t_user group by username) as temp_table
);
--再查看
mysql> select * from t_user;
+----+----------+------+
| id | username | age |
+----+----------+------+
| 55 | aaa | 20 |
| 57 | bbb | 20 |
| 60 | ccc | 20 |
| 64 | e | 10 |
| 65 | f | 5 |
+----+----------+------+
5 rows in set (0.00 sec)
--------END EOF 完毕-------
O
K
O
K
O
K