在实际应用中,很可能会碰到一些需要删除某些字段的重复记录,我现在把我能想到的写下来,望高手们补充。
1、
具体实现如下:
Table Create Table
------------ --------------------------------------------------------
users_groups CREATE TABLE `users_groups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`gid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8
users_groups.txt内容:
1,11,502
2,107,502
3,100,503
4,110,501
5,112,501
6,104,502
7,100,502
8,100,501
9,102,501
10,104,502
11,100,502
12,100,501
13,102,501
14,110,501
mysql> load data infile 'c:\\users_groups.txt' into table users_groups fields
rminated by ',' lines terminated by '\n';
Query OK, 14 rows affected (0.05 sec)
Records: 14 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from users_groups;
query result(14 records)
id |
uid |
gid |
1 |
11 |
502 |
2 |
107 |
502 |
3 |
100 |
503 |
4 |
110 |
501 |
5 |
112 |
501 |
6 |
104 |
502 |
7 |
100 |
502 |
8 |
100 |
501 |
9 |
102 |
501 |
10 |
104 |
502 |
11 |
100 |
502 |
12 |
100 |
501 |
13 |
102 |
501 |
14 |
110 |
501 |
14 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 |
|
很明显的第二个比第一个扫描的函数要少。
分享到:
相关推荐
### MySQL删除重复记录 在MySQL中,重复记录可能由于各种原因而出现,比如数据导入错误、系统故障或人为操作失误等。这些重复记录不仅浪费存储空间,还可能导致查询结果不准确,因此及时删除它们是非常必要的。 ##...
本文主要给大家介绍了关于MySQL中查询、删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as count from user_table group by title having ...
本文将详细介绍如何在不同的数据库系统(如MySQL、SQL Server、Oracle等)中删除重复记录。 #### SQL删除重复记录的基本思路 删除重复记录的核心思想是先识别出哪些记录是重复的,然后通过某种方式将这些重复记录...
### 方法1:基于`NOT IN`子句删除重复记录 这种方法通过找出每个重复组中最大`id`的记录保留下来,删除其他非最大`id`的记录。SQL语句如下: ```sql DELETE FROM YourTable WHERE id NOT IN (SELECT MAX(id) FROM ...
在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...
mysql彻底理解删除重复记录sql脚本,只保留一条记录
这种情况下,MySQL会锁定所有匹配的主键记录,确保删除操作的原子性。 8. 非唯一索引删除已标记为删除的记录: 如果记录已被标记为删除,但物理上仍然存在,删除操作依然会锁定这些记录。 9. 唯一索引删除已标记...
以下是一个简单的示例代码片段,展示了如何在 Delphi 中删除重复记录: ```delphi uses ADODB; procedure RemoveDuplicates(ADataset: TDataSet); var CurrentRecord, LastRecord: Variant; begin // 先移动到...
以下是一个具体的步骤,演示如何在MySQL中删除重复的数据记录,特别是针对`test`数据库中`title`字段的重复记录。 首先,创建一个临时表`bak`,用于存储不重复的记录。这里使用的SQL语句是: ```sql CREATE TABLE ...
以下是一种方法,保留`id`最小的重复记录: ```sql SELECT t1.* FROM ( SELECT name, email, MIN(id) AS min_id FROM users GROUP BY name, email HAVING COUNT(*) > 1 ) t2 JOIN users t1 ON t1.name = t2...
下面将详细解释这个问题,并提供几种有效的方法来处理MySQL中删除重复数据的情况。 首先,我们来看一下原始的删除语句: ```sql DELETE FROM users WHERE id IN (SELECT MIN(id) FROM users GROUP BY name HAVING ...
总结来说,MySQL删除重复行的方法主要是通过自连接来实现的。此方法的关键在于找到重复行,并基于某种主键或唯一标识(在本例中是`id`)选择保留的行。这种方法适用于那些有明确唯一标识符的表,能够有效地删除重复...
本文将介绍一种高效的方法,适用于MySQL中删除重复数据。 首先,我们假设有一个名为`data_content_152`的表,其中包含大量的重复记录。目标是保留唯一的数据,并删除重复项。以下是这种方法的步骤: 1. **创建临时...
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
本文主要探讨了在MySQL中如何查找并删除重复行,这对于维护数据库的整洁性和提高查询效率有着重要的作用。 首先,我们需要明确什么是重复行。在MySQL中,如果表中的某一行与其他行在特定列上的值完全相同,那么这些...
- 删除重复记录,保留`rowid`最小的记录: ```sql DELETE FROM people WHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1) AND rowid NOT IN (SELECT MIN(rowid...
本文将详细介绍如何在MySQL中查找并删除重复数据,同时只保留其中一条,具体以实例进行解析。 首先,假设我们有一个名为`test`的表格,包含以下字段:`school_id`、`school_name`、`total_student`和`test_takers`...