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

网站购物系统制作雨辰资讯电子商务类网站开发wordpress 多的模板

网站购物系统制作雨辰资讯电子商务类网站开发,wordpress 多的模板,杭州建设招标平台,福州高端网站建设公司【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.yayakq.cn/news/228524/

相关文章:

  • 网站友情链接怎么样做网站建设存在的问题及对策
  • 高端网站制作网址拟定网站建设合同的工作过程记录
  • 饲料网站建设 中企动力北京装饰公司十大排名
  • 宁波网站建设制作多少钱有了网站源代码
  • 郑州网站建设公司 排行工信部网站备案信息查询
  • 网站开发旅游前台模板网页制作成app
  • 如何做seo网站django 企业网站开发
  • seo的关键词无需优化大师是什么软件
  • 专业的网站建设找聚爱wordpress评论数字验证码
  • 电子商务网站建设与运营 说课南昌网站seo哪家公司好
  • 购物网站网页设计模板沈阳网站建设设计公司
  • 包头外贸网站建设微网站获取访客手机
  • 做冷冻食品的网站网络设置了代理怎么关闭
  • 郴州网站建设系统免费微信小程序商城官网
  • 网站后期推广方案群晖 wordpress 外网访问
  • wordpress 手机站插件手机网站模板 织梦
  • 宽屏网站设计中小型网站建设与管理设计总结
  • 百拓公司做网站怎么样什么营销软件好用
  • fontawesome wordpress网站建设优化解析
  • 导航网站开发工具微信网站开发系统
  • 建商城网站公司天津快速建站模板
  • 校园网站建设的论文盘锦市网站建设
  • 商城网站设计教程wordpress模板信息
  • 电子商务网站开发过程论文6平台公司运营模式
  • 推荐优秀网站中国机械加工信息网
  • 苏州外贸网站建设公司wordpress弱密码
  • 网站 数据库网站建设 长安镇
  • 自己做网站用什么appwordpress 自适应 主题
  • 急求一张 网站正在建设中的图片广告设计工作室
  • 比较大网站建设公司花卉网站开发可行性