当前位置: 首页 > news >正文

【Mysql】group语句删除重复数据只保留一条

【Mysql】group语句删除重复数据只保留一条

【一】案例分析

假如在数据初始化的时候,insert脚本执行了两次,导致表里的数据都是重复的(没有设置唯一键)。这个时候再加上mybatis-plus的selectOne方法,就会出现报错。因为selectOne方法要求查询结果必须唯一,如果出现多条数据就会报错。

所以需求就是,根据某个条件字段查询出所有这个字段存在重复的数据,然后删除掉重复的数据,保证条件查询的时候只能查出来1条数据。

以这张表为例:

CREATE TABLE `test`  (`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '注解id',`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO test (id,`name`) VALUES (replace(uuid(),'-',''),'张三'),(replace(uuid(),'-',''),'张三');

表里有两条数据,然后名字是相同的,但是id是不同的,现在要求是只留一条数据:
在这里插入图片描述

【二】步骤一:查询name值重复的数据
现实开发当中可能一个字段无法锁定重复值,可以采取group by多个值!利用多个值来锁定重复的行数据!

SELECTname 
FROMtest 
GROUP BY` name ` 
HAVINGcount( name ) > 1

【三】步骤二:查询重复数据里面每个最小的id

SELECTmin( id ) AS id 
FROMtest 
GROUP BY` name ` 
HAVINGcount( name ) > 1

【四】步骤三:查询去掉重复数据最小id的其他数据,也就是要删除的数据!

SELECT* 
FROMtest 
WHEREname IN ( SELECT name FROM test GROUP BY ` name ` HAVING count( name ) > 1 ) AND id NOT IN (SELECTmin( id ) FROMtest GROUP BY` name ` 
HAVINGcount( NAME ) > 1)

【五】步骤四:删除去掉重复数据最小id的其他数据
有了查询,直接改成delete不就可以了,真的是这样吗?其实不是的,如下运行报错:
在这里插入图片描述
首先明确一点这个错误只会发生在delete语句或者update语句,拿update来举例 : update A表 set A列 = (select B列 from A表); 这种写法就会报这个错误,原因:你又要修改A表,然后又要从A表查数据,而且还是同层级。Mysql就会认为是语法错误!

嵌套一层就可以解决,update A表 set A列 = (select a.B列 from (select * from A表) a); 当然这个只是个示例,这个示例也存在一定的问题,比如(select a.B列 from (select * from A表) a)他会查出来多条,然后赋值的时候会报 1242 - Subquery returns more than 1 row。

嵌套一层他就可以和update撇清关系,会优先查括号里面的内容,查询结果出来过后会给存起来,类似临时表,可能有的人该好奇了,update A表 set A列 = (select B列 from A表); 我明明加括号了呀,难道不算嵌套吗,当然不算,那个括号根本没有解决他们之间的层次关系!

【六】正确的写法
首先,先把表备份好,删错了也还能快速恢复。直接拷贝的一个新的表,改名字就行

(1)方式一

DELETE FROM test 
WHERE 
name IN ( select a.name from (SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1) a) 
AND 
id NOT IN (select a.id from (SELECT  min(id) as id FROM test GROUP BY `name` HAVING count( name ) > 1) a)

注意:删除之前一定要先查询,然后再删除,否则一旦语法有问题导致删了不想删除的数据,想要恢复很麻烦!或者删除前备份好数据,不要嫌麻烦,一旦出问题,才是真正的大麻烦!

(2)方法二

DELETE FROM test 
WHEREid NOT IN (SELECTt.id 
FROM( SELECT MIN(id) as id FROM test GROUP BY NAME ) t)

【七】错误的写法
千万千万不能这么搞,下面这个语法相当于是先按name分组,然后查出来大于1的,这时候假如大于1的有很多,然后外面嵌套的那一层,只取了最小的一条数据,然后再加上使用的是NOT IN,最终会导致数据全部被删除!!!

在这里插入图片描述

执行前有四条数据,实际上我们要的是张三留下来一条,然后李四留下来一条

在这里插入图片描述
执行结果:只留下了一条!

在这里插入图片描述

相关文章:

【Mysql】group语句删除重复数据只保留一条

【Mysql】group语句删除重复数据只保留一条 【一】案例分析 假如在数据初始化的时候,insert脚本执行了两次,导致表里的数据都是重复的(没有设置唯一键)。这个时候再加上mybatis-plus的selectOne方法,就会出现报错。因…...

Git详解和命令大全

目录 一、Git 的基本概念二、Git 的安装和使用三、Git 的版本分支管理四、Git 的命令大全1. 常用命令2. 命令大全 五、版本分支管理的最佳实践六、Git 实践七、高级特性八、Git 的未来发展 Git 是一款开源的分布式版本控制系统,可以有效地处理从小到非常大的项目版本…...

北漂Java程序员入职五个月的收获总结

👨‍💻博主主页:小尘要自信 👨‍💻本文专栏:Java程序员的成长 👨‍💻上一篇文章:告别过去,拥抱未来:一个Java开发者的成长之路 👨‍&a…...

Android系统的进程管理(创建->优先级->回收)

一、进程的创建 1、概述 Android系统以Linux内核为基础,所以对于进程的管理自然离不开Linux本身提供的机制。例如: 通过fork来创建进行通过信号量来管理进程通过proc文件系统来查询和调整进程状态 等 对于Android来说,进程管理的主要内容…...

C#界面美化小技巧

1.窗体设置为无边框 FormBorderStyle的属性设置为none 2.窗体无边框,可以拖拽 private Point mPoint new Point(); private void Download_MouseDown(object sender, MouseEventArgs e) { mPoint.X e.X; mPoint.Y e.Y; …...

‘vite‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

1.切换到工程目录下 2.执行npm install(最关键的一步了!!) 3. 最后直接运行:npm run dev 4.浏览器直接打开就行了!...

Linux下查阅帮助文档必学命令 man

Linux操作系统的使用中,我们经常会遇到很多问题,这个时候查询文档的能力至关重要,黄老师来推荐大家使用man,这时我们必须掌握的查阅能力: 最常用的命令: man 名称 man 数字(1~9) 名称 这里的数字分别代表:...

uniapp scroll-view显示滚动条

在style中添加样式: ::v-deep ::-webkit-scrollbar {/* 滚动条整体样式 */display: block;width: 10rpx !important;height: 10rpx !important;-webkit-appearance: auto !important;background: transparent;overflow: auto !important;}::v-deep ::-webkit-scroll…...

15、PHP神奇的数组索引替代

1、有数字索引指定的数组元素时&#xff0c;以数字索引的为准。 <?php $aarray(a,b,1>c,5>"d","e"); print_r($a); ?> 输出结果&#xff1a;b的位置直接被c替代了&#xff0c;e 的值为最大的整数索引1。 PHP不这么搞&#xff0c;怎么可能成…...

同为科技(TOWE)带热插拔功能机柜PDU插座的应用

所谓热插拔&#xff08;hot-plugging或Hot Swap&#xff09;&#xff0c;即带电插拔&#xff0c;指的是在不关闭系统电源的情况下&#xff0c;将模块、板卡插入或拔出系统而不影响系统的正常工作&#xff0c;从而提高了系统的可靠性、快速维修性、冗余性和对灾难的及时恢复能力…...

GR5526 128BIT UUID改16BIT UUID

以下两个宏定义是我添加的。其中USING_128BIT_UUID的条件编译部分是SDK原生部分&#xff0c;USING_16BIT_UUID条件编译部分则是由我修改&#xff0c;通过这样的修改&#xff0c;128BIT UUID就变更为16BIT UUID了。如果你的广播、扫描响应有涉及UUID&#xff0c;不要忘记更改它。…...

【Android】使用 CameraX 实现基础拍照功能

目录 目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 1. 基础开发环境 JDK&#xff1a;JDK17 Android Studio&#xff1a;Android Studio Giraffe | 2022.3.1 Android SDK&#xff1a;Android API 34 Gradle: gradle-7.2-bin.zip Ca…...

刷题笔记 day2

力扣 1089 复写零 思路&#xff1a;双指针 第一步&#xff1a;利用指针 cur 去记录最后一位要复写的数 &#xff0c; 利用指针 dest 指向最后一位数所要复写的位置&#xff1b; 实现过程&#xff1a;最开始 cur 指向0&#xff0c;dest 指向 -1 &#xff0c; 当arr[cur] ! …...

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-LS…...

使用UltraISO制作麒麟v10系统盘

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录 1 背景2 准备工作2.1 镜像准备2.2 制作工具2.3 启动U盘 3 制作步骤3.1 找到ISO文件&#xff0c;右…...

【RabbitMQ】之消息的可靠性方案

目录 一、数据丢失场景二、数据可靠性方案 1、生产者丢失消息解决方案2、MQ 队列丢失消息解决方案3、消费者丢失消息解决方案 一、数据丢失场景 MQ 消息数据完整的链路为&#xff1a;从 Producer 发送消息到 RabbitMQ 服务器中&#xff0c;再由 Broker 服务的 Exchange 根据…...

性能测试/负载测试/压力测试之间的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …...

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…...

sonarqube PHP编码规范检查

一、PSR规范整理 PHP 已有的编码规范如下 https://blog.csdn.net/qq_40876291/article/details/103848172 1.1 基本编码规范&#xff1a;PSR1 官网规范链接 https://www.php-fig.org/psr/psr-1/ 文件只能使用<?php和<?标记。文件必须仅使用UTF-8&#xff0c;而不使…...

Kylin 麒麟 Qt软件 QtCreator 中文输入法问题

Kylin 麒麟 Qt软件 QtCreator 中文输入法问题 背景&#xff1a; QtCreator 和程序在麒麟系统下没法进行输入&#xff0c;或没法进行输入法的切换。 包括麒麟自带默认搜狗输入法的切换也不行。 使用下面的命令进行安装后&#xff0c;可以正常在QtCreator和程序中使用输入法。 …...

Cursor Pro功能突破解决方案:基于cursor-free-vip的完整技术指南

Cursor Pro功能突破解决方案&#xff1a;基于cursor-free-vip的完整技术指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reache…...

MOS管选型实战指南

MOS管(金属氧化物半导体场效应晶体管)是现代电力电子和开关电路的核心元件。选型失误的后果往往是灾难性的——效率低下、发热严重、驱动振荡、甚至炸管冒烟。相比电阻电容,MOS管的选型需要权衡的维度更多:电压、电流、导通电阻、开关速度、驱动电压、热阻、体二极管特性……...

Odoo 19成本核算避坑指南:标准成本法下差异分析、委外加工汇率风险与WIP分录丢失问题

Odoo 19成本核算实战避坑指南&#xff1a;标准成本差异、委外加工与WIP分录的深度解决方案 在制造业数字化转型浪潮中&#xff0c;Odoo 19作为开源ERP的领军者&#xff0c;其制造与会计模块的深度集成能力备受企业青睐。然而&#xff0c;当我们真正将系统投入生产环境时&#x…...

人工智能|大模型——模型——大模型蒸馏详解(定义/原理/关键技术/落地)

摘要大模型蒸馏&#xff08;Model Distillation&#xff09;&#xff0c;即知识蒸馏&#xff08;Knowledge Distillation&#xff09;&#xff0c;是一种将大型教师模型&#xff08;如BERT、GPT-4o、DeepSeek-R1&#xff09;的“隐含知识”高效迁移至轻量级学生模型&#xff08…...

源代码之下的硅基启示录——Claude Code“核泄漏”事件的深度剖析与时代回响

引言 公元2026年3月30日&#xff0c;一个看似平常的春日&#xff0c;硅基世界却迎来了一场史无前例的地震。 一家以“安全”为最高信条的AI公司&#xff0c;以一种最荒诞的方式&#xff0c;亲手打开了潘多拉的魔盒。Anthropic&#xff0c;这家估值高达3800亿美元的AI新贵&#…...

Jimeng LoRA环境部署教程:Python+Torch+CUDA兼容性避坑与版本匹配指南

Jimeng LoRA环境部署教程&#xff1a;PythonTorchCUDA兼容性避坑与版本匹配指南 1. 项目简介 Jimeng LoRA&#xff08;即梦LoRA&#xff09;是一个专门为LoRA模型测试设计的轻量级文本生成图像系统。这个项目的核心价值在于它能让你只用加载一次基础模型&#xff0c;然后快速…...

药物研发新思路:共价对接工具AutoDock4实战指南(附避坑技巧)

药物研发新思路&#xff1a;共价对接工具AutoDock4实战指南&#xff08;附避坑技巧&#xff09; 在当今药物研发领域&#xff0c;共价抑制剂因其独特的作用机制和显著的治疗优势正受到前所未有的关注。与传统非共价药物相比&#xff0c;这类分子能与靶蛋白形成稳定的共价键&…...

国产铷原子钟 快稳铷原子钟突破铷钟启动时长痛点 铷钟 特种铷原子钟

在数字化浪潮席卷全球的今天&#xff0c;时频同步已成为支撑通信、电力、国防、科研等关键领域稳定运行的核心基石。从6G基站的纳秒级协同&#xff0c;到智能电网的故障精准定位&#xff0c;再到北斗导航的车道级精度保障&#xff0c;每一个场景都对时间频率的准确度、稳定度提…...

当条形图遇上极坐标:径向与圆形条形图的视觉革命

1. 设计原理这两种图表把传统的笛卡尔坐标系换成极坐标系&#xff1a;角度表示类别&#xff0c;半径或角度长度表示数值。1.1. 径向条形图径向条形图本质上是将传统条形图的直角坐标系转换为极坐标系。在极坐标系中&#xff0c;每个数据点不再由(x, y)定位&#xff0c;而是由(角…...

5分钟快速上手:UNTRUNC视频修复工具终极指南

5分钟快速上手&#xff1a;UNTRUNC视频修复工具终极指南 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 你是否曾经因为相机…...