Mysql 删除重复数据保留一条有效数据(最新推荐)
作者:蕃薯耀 发布时间:2024-01-20 17:08:11
标签:Mysql,删除重复数据,保留一条
Mysql 删除重复数据保留一条有效数据
一、Mysql 删除重复数据,保留一条有效数据
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 删除重复数据(多个字段分组)
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 查询出可以删除的重复数据
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没有重复记录
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关键字筛选出表中重复数据
SELECT `name`,COUNT(1) FROM TAB GROUP BY `name` HAVING COUNT(1) >1
可以通过分组语句从每种重复数据中都拿出一条标识
SELECT `name`,id FROM TAB GROUP BY `name` HAVING COUNT(1) >1
删除重复记录并且只保留一条 [留意SQL注释]
DELETE from tab where
-- 删除所有的重复时间 Begin --
`name` in (
SELECT * from (SELECT `name`FROM TAB GROUP BY `name` HAVING 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如何删除所有多余的重复数据
方法一查询出的所有多余的重复记录:
方法二查询出的所有多余的重复记录(与方法一的结果相同):
方法三查询出的所有多余的重复记录:这里方法三因为用了MAX()方法(也可改用MIN()),查询结果记录的id不太一样,但也可以被视为重复多余的数据,关键是你希望选择保留哪一条记录而已。
MySql如何删除所有多余的重复数据 需要处理的数据,如:
出现重复的数据,如:
先用SELECT查询看看结果:
-- 方法一
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
)
方法一查询出的所有多余的重复记录:
-- 方法二
SELECT * FROM t_user WHERE id NOT IN (
SELECT MIN(id) FROM t_user GROUP BY user_name
)
方法二查询出的所有多余的重复记录(与方法一的结果相同):
-- 方法三
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
)
方法三查询出的所有多余的重复记录:
这里方法三因为用了MAX()方法(也可改用MIN()),查询结果记录的id不太一样,但也可以被视为重复多余的数据,关键是你希望选择保留哪一条记录而已。
下面是对上面的SELECT语句稍作修改并加入了DELETE
-- 方法一(笨方法但容易理解)
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
)
最后删除成功之后,显示数据已经没有重复的了
来源:https://blog.csdn.net/w995223851/article/details/128816753


猜你喜欢
- python实现学员管理系统这个小程序是我刚刚接触python时,导师带着做的第一个小项目。通过这次练习,我学会了很多东西。下面是具体的代码
- 一、我的需求对于这样的一个 csv 表,需要将其(1)将营业部名称和日期和股票代码进行拼接(2)对于除了买入金额不同的的数据需要将它们的买入
- 利用Python + wxpy 可以快速的查询自己好友的地区分布情况,以及好友的性别分布数量。还可以批量下载好友的头像,拼接成大图。本次教程
- 如果在 Access 数据库中删除数据或对象,或者在 Access 项目中删除对象,Access 数据库或 Access 项目可能会产生碎片
- 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语
- 一、类的定义和使用python定义一个类的基本语法是:class classname([基类一,基类二...]): &
- 前言:tkinter提供了3种布局管理方式:1、pack2、grid3、place每种布局管理器都非常有用,根据不同的需求,选择对应的布局方
- 1. 概述information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其
- 原始生成对抗网络Generative Adversarial Networks GAN包含生成器Generator和判别器Discrimin
- 前言本文主要给大家介绍了关于laravel5异常错误FatalErrorException in Handler.php line 38的解
- Go 编写定时器和定时任务在 项目开发当中,可能会遇到这样的场景:1 A任务需要在多久之后执行一次(定时器)2.B任务需要每隔多长时间执行一
- 项目总览创建虚拟环境mkvirtualenv meiduo_malls创建项目django-admin startproject meidu
- JPA之映射mysql text类型问题背景jpa如果直接映射mysql的text/longtext/tinytext类型到String字段
- MVVM模式不但可用于Form表单,在复杂的管理页面中也能大显身手。例如,分页显示Blog的功能,我们先把后端代码写出来:在apis.py中
- 对于如何结束一个Python程序或者用Python操作去结束一个进程等,Python本身给出了好几种方法,而这些方式也存在着一些区别,对相关
- 为什么要建立索引?当在非常大的表中进行查询,如果数据库进行全表遍历的话那么速度是会非常慢的,而我们的索引则可以建立一个b+树的结构,可以自上
- 姓名的翻译: 英语是名(First name)在前,姓(Last name)在后。中文地址的翻译:如果你英语水平不高,填表时只要国家名用英语
- 本文介绍了linux下如何备份与恢复mysql数据库。数据库备份是非常重要的。如果定期做好备份,这样就可以在发生系统崩溃时恢复数据到最后一次
- 如果一些应用需要到中文字体(如果pygraphviz,不安装中文字体,中文会显示乱码),就要在image 中安装中文字体。默认 python
- (ob1 is ob2) 等价于 (id(ob1) == id(ob2))首先id函数可以获得对象的内存地址,如果两个对象的内存地址是一样的