4 rows in set (0.00 sec)
mysql> create temporary table tmp_wrap select * from users_groups group by uid having count(1) > 1 union all
select * from users_groups group by uid having count(1) = 1;
Query OK, 7 rows affected (0.11 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> truncate table users_groups;
Query OK, 14 rows affected (0.03 sec)
mysql> insert into users_groups select * from tmp_wrap;
Query OK, 7 rows affected (0.03 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> select * from users_groups;
query result(7 records)
| id |
uid |
gid |
| 1 |
11 |
502 |
| 2 |
107 |
502 |
| 3 |
100 |
503 |
| 4 |
110 |
501 |
| 5 |
112 |
501 |
| 6 |
104 |
502 |
| 9 |
102 |
501 |
mysql> drop table tmp_wrap;
Query OK, 0 rows affected (0.05 sec)
2、还有一个很精简的办法。
查找重复的,并且除掉最小的那个。
delete users_groups as a from users_groups as a,
(
select *,min(id) from users_groups group by uid having count(1) > 1
) as b
where a.uid = b.uid and a.id > b.id;
(7 row(s)affected)
(0 ms taken)
query result(7 records)
| id |
uid |
gid |
| 1 |
11 |
502 |
| 2 |
107 |
502 |
| 3 |
100 |
503 |
| 4 |
110 |
501 |
| 5 |
112 |
501 |
| 6 |
104 |
502 |
| 9 |
102 |
501 |
3、现在来看一下这两个办法的效率。
运行一下以下SQL 语句
create index f_uid on users_groups(uid);
explain select * from users_groups group by uid having count(1) > 1 union all
select * from users_groups group by uid having count(1) = 1;
explain select * from users_groups as a,
(
select *,min(id) from users_groups group by uid having count(1) > 1
) as b
where a.uid = b.uid and a.id > b.id;
query result(3 records)
| id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
| 1 |
PRIMARY |
users_groups |
index |
(NULL) |
f_uid |
4 |
(NULL) |
14 |
|
| 2 |
UNION |
users_groups |
index |
(NULL) |
f_uid |
4 |
(NULL) |
14 |
|
| (NULL) |
UNION RESULT |
<union1,2> |
ALL |
(NULL) |
(NULL) |
(NULL) |
(NULL) |
(NULL) |
|
query result(3 records)
| id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
| 1 |
PRIMARY |
<derived2> |
ALL |
(NULL) |
(NULL) |
(NULL) |
(NULL) |
4 |
|
| 1 |
PRIMARY |
a |
ref |
PRIMARY,f_uid |
f_uid |
4 |
b.uid |
1 |
Using where |
| 2 |
DERIVED |
users_groups |
index |
(NULL) |
f_uid |
4 |
(NULL) |
14 |
|
很明显的第二个比第一个扫描的函数要少。