服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - Mysql 删除重复数据保留一条有效数据(最新推荐)

Mysql 删除重复数据保留一条有效数据(最新推荐)

2023-02-09 11:54蕃薯耀 Mysql

这篇文章主要介绍了Mysql 删除重复数据保留一条有效数据,实现原理也很简单,mysql删除重复数据,多个字段分组操作,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下

Mysql 删除重复数据保留一条有效数据

一、Mysql 删除重复数据,保留一条有效数据

?
1
2
3
4
5
6
DELETE FROM SZ_Building WHERE id NOT IN (
  SELECT t.min_id FROM (
    SELECT MIN(id) AS min_id FROM SZ_Building GROUP BY BLDG_NO
  ) t
)
;

原理:

根据字段对数据进行分组,查询出所有分组的最小ID(即要保留的不重复数据)将查询出来的数据(所有不重复的数据)存放到临时表中从原来的表中删除ID不在临时表中的重复数据

二、Mysql 删除重复数据(多个字段分组)

?
1
2
3
4
5
6
DELETE FROM SZ_Water_Level WHERE id NOT IN (
  SELECT t.min_id FROM (
    SELECT MIN(id) AS min_id FROM SZ_Water_Level GROUP BY CZBM,SJ,SW
  ) t
)
;

三、Mysql 查询出可以删除的重复数据

?
1
2
3
4
5
6
7
SELECT * FROM SZ_Building WHERE BLDG_NO IN (
    SELECT BLDG_NO FROM SZ_Building GROUP BY BLDG_NO HAVING COUNT(1)>1
)
AND id NOT IN (
    SELECT MIN(id) FROM SZ_Building GROUP BY BLDG_NO HAVING COUNT(1)>1
)
;

补充:mysql删除重复记录并且只保留一条

准备的测试表结构及数据

插入的数据中A,B,E存在重复数据,C没有重复记录

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE `tab` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of tab
-- ----------------------------
INSERT INTO `tab` VALUES ('1', 'A');
INSERT INTO `tab` VALUES ('2', 'A');
INSERT INTO `tab` VALUES ('3', 'A');
INSERT INTO `tab` VALUES ('4', 'B');
INSERT INTO `tab` VALUES ('5', 'B');
INSERT INTO `tab` VALUES ('6', 'C');
INSERT INTO `tab` VALUES ('7', 'B');
INSERT INTO `tab` VALUES ('8', 'B');
INSERT INTO `tab` VALUES ('9', 'B');
INSERT INTO `tab` VALUES ('10', 'E');
INSERT INTO `tab` VALUES ('11', 'E');
INSERT INTO `tab` VALUES ('12', 'E');

使用HAVING关键字筛选出表中重复数据

?
1
SELECT `name`,COUNT(1) FROM TAB GROUP BY `name` HAVING COUNT(1) >1

Mysql 删除重复数据保留一条有效数据(最新推荐)

可以通过分组语句从每种重复数据中都拿出一条标识

?
1
SELECT `name`,id  FROM TAB GROUP BY `nameHAVING COUNT(1) >1

Mysql 删除重复数据保留一条有效数据(最新推荐)

删除重复记录并且只保留一条 [留意SQL注释] 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELETE from tab where
-- 删除所有的重复时间 Begin --
`name` in (
    SELECT * from (SELECT `name`FROM TAB GROUP BY `nameHAVING COUNT(1) >1) tmp2
)
-- 删除所有的重复时间 END --
-- 但一些特定ID的记录不进行删除  Begin --
AND
id NOT in(
    select id from (
        SELECT `name`,id  FROM TAB GROUP BY `name` HAVING COUNT(1) >1
    ) tmp1
)
-- 但一些特定ID的记录不进行删除  END --

Mysql 删除重复数据保留一条有效数据(最新推荐)

执行后最终结果

Mysql 删除重复数据保留一条有效数据(最新推荐)

方法二

MySql如何删除所有多余的重复数据

方法一查询出的所有多余的重复记录:

方法二查询出的所有多余的重复记录(与方法一的结果相同):

方法三查询出的所有多余的重复记录:这里方法三因为用了MAX()方法(也可改用MIN()),查询结果记录的id不太一样,但也可以被视为重复多余的数据,关键是你希望选择保留哪一条记录而已。

MySql如何删除所有多余的重复数据 需要处理的数据,如:

Mysql 删除重复数据保留一条有效数据(最新推荐)

出现重复的数据,如:

Mysql 删除重复数据保留一条有效数据(最新推荐)

先用SELECT查询看看结果:

?
1
2
3
4
5
6
7
-- 方法一
SELECT * FROM t_user WHERE user_name IN (
    SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1
AND id NOT IN (
    SELECT MIN(id) FROM t_user GROUP BY user_name HAVING COUNT(1)>1
)

方法一查询出的所有多余的重复记录:

Mysql 删除重复数据保留一条有效数据(最新推荐)

?
1
2
3
4
-- 方法二
SELECT * FROM t_user WHERE id NOT IN (
    SELECT MIN(id) FROM t_user GROUP BY user_name
)

方法二查询出的所有多余的重复记录(与方法一的结果相同):

Mysql 删除重复数据保留一条有效数据(最新推荐)

?
1
2
3
4
-- 方法三
SELECT * FROM t_user AS t1 WHERE t1.id <> (
    SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name
)

方法三查询出的所有多余的重复记录:

Mysql 删除重复数据保留一条有效数据(最新推荐)

这里方法三因为用了MAX()方法(也可改用MIN()),查询结果记录的id不太一样,但也可以被视为重复多余的数据,关键是你希望选择保留哪一条记录而已。

下面是对上面的SELECT语句稍作修改并加入了DELETE

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- 方法一(笨方法但容易理解)
DELETE FROM t_user WHERE user_name IN (
    SELECT t1.user_name FROM (
        -- 查询出所有重复的user_name
        SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1
    ) t1
)
AND id NOT IN (
    SELECT t2.min_id FROM (
        -- 查询出所有重复的记录并各自只取其中一条(MIN(id)或MAX(id)都可以)
        SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name HAVING COUNT(1)>1
    ) t2
)
-- 方法二(推荐方法也容易理解)
DELETE FROM t_user WHERE id NOT IN (
    SELECT t.min_id FROM (
        -- 过滤出重复多余的数据,比如,如果所有记录中存在1条记录是user_name=zhangsan的,那么就取出它;
        -- 如果所有记录中存在多条记录是user_name=lisi的,那么只取其中1条,其他的不查询出来
        SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name
  ) t
)
-- 方法三(推荐方法但不太容易理解)
DELETE FROM t_user WHERE id IN (
    SELECT t.id FROM (
        -- 1. 关于所有存在相同user_name的记录,只查询出(保留)重复记录中的1条,假设这样查询出来的集合为A集合。
        -- 2. 在所有记录中,只要id不在A集合中的,都把它们查询出来
        SELECT t1.id FROM t_user AS t1 WHERE t1.id <> (SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name)
    ) t
)
-- 或
DELETE FROM t_user t1
WHERE t1.id <> (
    SELECT t2.max_id FROM (
        SELECT MAX(t3.id) AS max_id FROM t_user t3 WHERE t1.user_name=t3.user_name
    ) t2
)

最后删除成功之后,显示数据已经没有重复的了

到此这篇关于Mysql 删除重复数据保留一条有效数据的文章就介绍到这了,更多相关Mysql 删除重复数据内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/w995223851/article/details/128816753

延伸 · 阅读

精彩推荐
  • Mysql详解mysql查询缓存简单使用

    详解mysql查询缓存简单使用

    这篇文章主要介绍了详解mysql查询缓存简单使用的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考...

    pedro712272021-04-21
  • Mysqlmysql数据库太大了如何备份与还原

    mysql数据库太大了如何备份与还原

    今天小编就为大家分享一篇关于mysql数据库太大了如何备份与还原,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    精哥哥6302020-09-14
  • MysqlMysql支持的数据类型(列类型总结)

    Mysql支持的数据类型(列类型总结)

    MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的...

    默默淡然2192020-07-05
  • MysqlMySQL由浅入深掌握连接查询

    MySQL由浅入深掌握连接查询

    连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点...

    桃花键神5502022-03-09
  • Mysql推荐几款MySQL相关工具

    推荐几款MySQL相关工具

    随着互联网技术的不断发展, MySQL 相关生态也越来越完善,越来越多的工具涌现出来。一些公司或个人纷纷开源出一些不错的工具,本篇文章主要介绍几款...

    MySQL技术3322020-11-26
  • MysqlMysql两种情况下更新字段中部分数据的方法

    Mysql两种情况下更新字段中部分数据的方法

    Mysql更新字段中部分数据的两种情况在下文给予详细的解决方法,感兴趣的朋友可以参考下哈 ...

    MYSQL教程网4362019-12-25
  • MysqlMysql Update批量更新的几种方式

    Mysql Update批量更新的几种方式

    今天小编就为大家分享一篇关于Mysql Update批量更新的几种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编...

    bluexue07243532019-06-04
  • MysqlMySQL null的一些易错点

    MySQL null的一些易错点

    这篇文章主要介绍了MySQL null的一些易错点,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下...

    OMOZ10772021-03-23