MySQL去重复保留一条操作

一、查询不重复数据

MySQL有distinct、group by和having等实现查询不重复数据的方法,但实际上它们的实现机制并不完全一致,需根据实际场景选择最优解。

1. Distinct方法

SELECT DISTINCT column FROM table;

该方法适用于筛选单个字段不重复数据的场景,例如:

SELECT DISTINCT name FROM students;

这将返回去重后所有不同的名字。

2. Group By方法

SELECT column1, column2, ... FROM table GROUP BY column1, column2, ...;

该方法适用于筛选多个字段不重复数据的场景,例如:

SELECT name, age FROM students GROUP BY name, age;

这将返回去重后所有不同的姓名和对应年龄。

3. Having方法

SELECT column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING condition;

该方法适用于筛选多个字段不重复数据并需要指定条件的场景,例如:

SELECT name, age FROM students GROUP BY name, age HAVING COUNT(*) > 1;

这将返回去重后所有重复的姓名和对应年龄。

二、删除重复数据

MySQL可以使用三种方法实现删除重复数据:去重查询+临时表、子查询和自联接。

1. 去重查询+临时表

首先使用去重查询构建一个临时表,再根据临时表的唯一键删除重复行:

CREATE TABLE temp_table SELECT DISTINCT * FROM table;
ALTER TABLE temp_table ADD UNIQUE INDEX unique_index (column1, column2, ...);
DELETE t1 FROM table t1, temp_table t2 WHERE t1.column1=t2.column1 AND t1.column2=t2.column2 ...;

2. 子查询

使用子查询筛选出重复行的主键值,再根据主键值删除重复行:

DELETE FROM table WHERE id IN (SELECT id FROM (SELECT id, column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING COUNT(*) > 1) as temp_table);

3. 自联接

使用自联接查找重复数据的主键值,并根据主键值删除重复行:

DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.column1=t2.column1 AND t1.column2=t2.column2 ...;

三、保留一条重复数据

MySQL中可以使用多种方法保留一条重复数据:使用子查询、临时表、内联接等,具体需根据数据特征和查询效率选取。

1. 子查询

使用子查询筛选出重复行中的最小/最大ID值,并将其余ID值删除:

DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY column1, column2 ...);

2. 临时表

使用临时表构建一份保留一条数据的副本,并将其余数据删除:

CREATE TABLE temp_table SELECT MIN(id) as id, column1, column2, ... FROM table GROUP BY column1, column2 ...;
DELETE t1 FROM table t1 LEFT JOIN temp_table on t1.id=temp_table.id WHERE temp_table.id IS NULL;

3. 内联接

使用内联接查询保留一条数据:

DELETE t1 FROM table t1 INNER JOIN table t2 ON t1.column1=t2.column1 AND t1.column2=t2.column2 ... WHERE t1.id > t2.id;

四、小结

MySQL去重复保留一条数据,常用的方法有查询不重复数据、删除重复数据和保留一条重复数据三种,每种方法有多种实现方式,需根据具体场景选取最优解。

原创文章,作者:JDDR,如若转载,请注明出处:https://www.506064.com/n/136575.html

(0)
JDDRJDDR
上一篇 2024-10-04
下一篇 2024-10-04

相关推荐

发表回复

登录后才能评论