• MySQL开发技巧——删除重复数据


     目录

    第一关 利用主键删除 

    第二关 复杂重复数据删除


    第一关 利用主键删除 

    任务描述

    本关任务:按照要求删除表中重复用户。

    相关知识

    在工作或平时练习中,我们会发现表中经常有重复数据,分情况我们可能需要这些重复数据,也可能不需要这些数据,那么我们该如何找出这些不需要的重复数据并删除呢?

    重复数据

    下面我们来看一组数据,users表结构及数据如下:

    id(主键)user_nameuser_pwd
    1user1123
    2user2456
    3user3789
    4user1111
    5user1222
    6user1333

    上面users表中出现了相同用户名的重复数据,我们需要将其重复的删除,首先我们将重复用户查出来:

    找到重复的用户后我们要怎么删除呢?又要怎么选择保留的数据呢?

    解题思路

    假设我们要保留的数据为先注册的账号,我们可将思路拟定如下:

    • 确定了保留先注册的账号,也就等同保留的数据为id较小的,我们可利用 聚合函数 得到重复数据中的最小id用户;

    • 使用表关联,将重复数据中最小id用户与源users表中的id进行对比,删除users表中id比重复数据中的最小id 的记录,删除后表中的数据就是先注册用户的数据了。

    编程要求

    请仔细阅读代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

    • users表中重复数据去除,保留先注册的账号。(你只需要删除表中重复数据即可,平台将为你查询表中数据)。

    预期输出:

    1. +----+-----------+----------+
    2. | id | user_name | user_pwd |
    3. +----+-----------+----------+
    4. | 1 | user2    | 972    |
    5. | 2 | user5    | 984    |
    6. | 4 | user7    | 474    |
    7. | 5 | user9    | 312    |
    8. | 7 | user3    | 840    |
    9. | 8 | user4    | 485    |
    10. | 11 | user1   | 570    |
    11. | 12 | user6   | 164    |
    12. | 14 | user8   | 884    |
    13. +----+-----------+----------+

    1. #请在此添加实现代码
    2. ########## Begin ##########
    3. delete from users where id in (
    4. select * from(
    5. select id from users where user_name
    6. in(
    7. select user_name from users group by user_name having count(1)>1
    8. )
    9. and id not in(
    10. select min(id) from users group by user_name having count(1)>1
    11. )
    12. )as stu_repeat_copy
    13. );
    14. ########## End ##########

    第二关 复杂重复数据删除

    任务描述

    本关任务:删除表中mobile列出现的重复电话号码。

    相关知识

    在上一章节中我们已经解决了去除简单的重复数据,那如果表中的重复数据是组合的复杂数据呢?我们又该如何解决?

    重复数据

    下面我们继续看一组数据,仍用上一章节的users表,现在多一列mobile数据:

    id(主键)user_nameuser_pwdmobile
    1user112318212345678,18201234567,18212345678
    2user245618266666666,18288888888
    3user378918268686868,18278787878,18268686868,18278787878

    解题思路

    看到mobile列中的数据是不是很亲切,在之前学习 行列转换 时我们见过了。

    遇到这种情况要将数据去重,我们的解题思路基本就可以拟定为把数据拆开后去重再将数据重新组合。

    下面我们细分成几个小步骤来看:

    • 统计mobile列中各用户的电话数量;

    • 拆分数据(连接序列化表);

    • 截取数据;

    • 最后一步我们只需要将数据去重,然后再分组进行组合就大功告成了。

    编程要求

    请仔细阅读代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

    • 根据解题思路的步骤完成去除users表中mobile列的重复电话号码。(你只需要删除表中重复数据即可,如mobile列数据为18212345678,18201234567,18212345678,去除重复数据之后的数据为18212345678,18201234567。)

    预期输出:

    1. +-------------+---------+
    2. | mob      | len   |
    3. +-------------+---------+
    4. | 18201234567 | 23.0000 |
    5. | 18212345678 | 23.0000 |
    6. | 18266666666 | 23.0000 |
    7. | 18268686868 | 23.0000 |
    8. | 18278787878 | 23.0000 |
    9. | 18288888888 | 23.0000 |
    10. +-------------+---------+

    mob 列为将mobile列所有号码升序输出的结果,len 列为号码所在行的mobile列长度。

    1. #请在此添加实现代码
    2. ########## Begin ##########
    3. update users b join (
    4. select user_name,group_concat(
    5. distinct SUBSTRING_INDEX(SUBSTRING_INDEX(mobile,',',t.id),',',-1)
    6. ) mobile from (
    7. select user_name,mobile,length(concat(mobile,','))-length(replace(mobile,',','')) size from users
    8. ) a inner join tb_sequence t on a.size>=t.id group by a.user_name
    9. ) c on b.user_name = c.user_name set b.mobile = c.mobile;
    10. ########## End ##########

  • 相关阅读:
    Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)
    gamingtcui.dll 丢失的全面解决方案指南,快速修复gamingtcui.dll文件
    JAVA集合框架工具类自定义Collections集合方法
    JVM学习——4——Java Memory Model ( JMM ) java内存模型
    JSON+<boost/property_tree/json_parser.hpp>+<boost/property_tree/ptree.hpp>
    Echarts 实现将X轴放在图表顶部并且自动播放展示提示信息内容
    linux下的c/c++动静态库
    照片+制作照片书神器,效果太棒了!
    SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池
    【数据结构】数组和字符串(四):特殊矩阵的压缩存储:稀疏矩阵——三元组表
  • 原文地址:https://blog.csdn.net/weixin_51970555/article/details/126751493