MySQL_用一条SQL语句删除重复记录

 

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); 


--查看
mysql> select * from t_user;
+----+----------+------+
| id | username | age  |
+----+----------+------+
| 55 | aaa      |   20 |
| 56 | aaa      |   20 |
| 57 | bbb      |   20 |
| 58 | bbb      |   20 |
| 59 | bbb      |   20 |
| 60 | ccc      |   20 |
| 61 | ccc      |   20 |
| 62 | ccc      |   20 |
| 63 | ccc      |   20 |
| 64 | e        |   10 |
| 65 | f        |    5 |
+----+----------+------+
11 rows in set (0.00 sec)

 

--删除

 

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


 

你可能感兴趣的:(mysql)