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

化妆品购物网站排名软件外包企业排名

化妆品购物网站排名,软件外包企业排名,建设项目网站,如何做自己的淘客网站【Mysql】group语句删除重复数据只保留一条 【一】案例分析 假如在数据初始化的时候,insert脚本执行了两次,导致表里的数据都是重复的(没有设置唯一键)。这个时候再加上mybatis-plus的selectOne方法,就会出现报错。因…

【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,最终会导致数据全部被删除!!!

在这里插入图片描述

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

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

在这里插入图片描述

http://www.yidumall.com/news/13363.html

相关文章:

  • 北京市朝阳区社会建设工作办公网站推广注册app拿佣金
  • github wordpress主题旺道智能seo系统
  • 运营管理培训seo北京公司
  • 济源哪里做网站域名服务器查询
  • 服装企业网站建设策划书企业文化经典句子
  • 凡客做网站今天nba新闻最新消息
  • 做100个垂直网站推广形式有哪几种
  • 自己搭建服务器网站开发软件引擎搜索是什么意思
  • 网站首页代码怎么写宁波seo网络推广渠道介绍
  • reactjs 做的网站广州百度快速排名优化
  • c#网站开发视频教程 高清代发百度关键词排名
  • 网站优化怎么做 有什么技巧宁波seo公司网站推广
  • 自己做的网站为什么不显示图片网站页面分析
  • 网站建设的基础是什么意思seo是哪个英文的简写
  • 住房和城乡建设部网站公布信息正规app推广
  • 第三方做农产品价格数据的网站谷歌seo博客
  • 网站弹出窗口代码恶意点击软件哪几种
  • 社会题目可以在哪些网站上做成都百度推广账户优化
  • 全国网站排名百度seo 站长工具
  • 网站开发需求分析文档怎样做网站平台
  • asp网站伪静态西安seo优化工作室
  • 安全狗iis版删了以后 网站打不开影视后期培训班一般要多少钱
  • 济南网站制作培训班电商网站建设
  • 东莞高端网站建设公司8大营销工具
  • 网站界面优化沈阳网站seo公司
  • 跨境电商那个网站做饰品比较好seo网站优化服务合同
  • 做网站优化如何写方案黑帽seo技巧
  • 网站建站论坛google推广及广告优缺点
  • 有没有电脑做兼职的网站好看的网站ui
  • 简单个人网站制作教程站内推广的方法和工具