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

MySQL 处理重复数据:保留一条与两条的实现方案

在数据库管理中,处理重复数据是一项常见的任务。本文将详细介绍如何在 MySQL 数据库里,针对 test 表中 fd 和 fe 字段存在的重复数据进行处理,分别实现保留一条和两条数据的操作。

表结构与需求概述

假设 test 表包含三个字段:id(作为主键)、fd 和 fe。其中,fd 和 fe 字段存在重复值,我们的目标是分别保留每组重复数据中的一条和两条记录,同时删除其余的重复数据。

保留每组重复数据中的一条记录

思路

我们可以使用子查询结合 MIN(id) 函数,按 fd 和 fe 字段分组,找出每组中 id 最小的记录,然后删除 id 不在这些最小 id 范围内的记录。

SQL 代码

DELETE 
FROM
    test 
WHERE
    id NOT IN (
    SELECT
        id 
    FROM
    ( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 1 ORDER BY id ) a 
    );

代码解释

  1. 子查询SELECT min( id ) id FROM test GROUP BY fd, fe HAVING count( id ) > 1 按 fd 和 fe 分组,找出每组中 id 最小的记录,并且只考虑重复记录数大于 1 的组。
  2. 外层查询DELETE FROM test WHERE id NOT IN (...) 删除 id 不在子查询结果中的记录,从而保留每组中的一条记录。

 

保留每组重复数据中的两条记录

思路

为了保留每组中的两条记录,我们可以分别找出每组中 id 最小和最大的记录,然后使用 UNION 操作符将它们合并,最后删除 id 不在合并结果中的记录。

SQL 代码

DELETE 
FROM
    test 
WHERE
    id NOT IN (
    SELECT
        id 
    FROM
    ( SELECT
        id 
    FROM
        test 
    WHERE
        id IN (
        SELECT
            id 
        FROM
        ( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a 
        UNION 
        SELECT
            id 
        FROM
        ( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b 
        )) c
    );

代码解释

  1. 子查询 aSELECT min( id ) id FROM test GROUP BY fd, fe HAVING count( id ) > 2 找出每组中 id 最小的记录,只考虑重复记录数大于 2 的组。
  2. 子查询 bSELECT max( id ) id FROM test GROUP BY fd, fe HAVING count( id ) > 2 找出每组中 id 最大的记录,同样只考虑重复记录数大于 2 的组。
  3. UNION 操作:将子查询 a 和 b 的结果合并,得到每组中 id 最小和最大的记录。
  4. 外层查询DELETE FROM test WHERE id NOT IN (...) 删除 id 不在合并结果中的记录,从而保留每组中的两条记录。

http://www.kler.cn/a/598434.html

相关文章:

  • 力扣 797. 所有可能的路径 解析JS、Java、python、Go、c++
  • 使用 CMake 来编译和运行C/C++ 项目流程
  • Linux CentOS7 安装 ffmpeg教程
  • vscode python 入门教程(二) vscode使用gti 管理代码
  • Redis实战常用二、缓存的使用
  • 人工智能新玩法:被现象级IP带火过后“人工智能”已经挑起大梁?
  • 【Linux文件IO】Linux中文件属性与目录操作的API介绍和用法
  • 施磊老师高级c++(五)
  • 使用 Go 构建 MCP Server
  • UWB定位技术在矿山、地铁等特殊环境的核心应用
  • 蓝桥杯关于字符串的算法题目(leetcode回文串的判断问题)
  • wangEditor富文本轻量使用及多个编辑器
  • 利用 MATLAB/Simulink 建立完整的控制系统模型,并进行阶跃响应和负载扰动响应仿真
  • 用ACM模式模板刷hot100
  • 一个KADB测试实践
  • 【AI模型】深度解析:DeepSeek的联网搜索的实现原理与认知误区
  • 路由工程师大纲-2:结合AI技术构建路由拓扑与BGP异常检测的知识链体系
  • 计算机操作系统(三) 操作系统的特性、运行环境与核心功能(附带图谱更好对比理解))
  • [DDD架构]不同数据模型DTO、VO、PO、DAO、DO的含义
  • uboot linux-kernel buildroot 编译纪要