MySQL中的多字段相同数据去重复

目录
  • MySQL多字段相同数据去重复
    • 1、多字段转单字段
    • 2、把多字段合并为单字段
    • 3、将查询到的重复id
    • 4、将获取到重复数据最小的id值
    • 5、bug补充
    • 6、将步骤4的代码多执行几次
  • 总结

MySQL多字段相同数据去重复

MySQL多字段去重复实际上是单字段去重复的衍生,原理就是把多字段数据通过子查询合并为单字段的数据表,再通过单字段数据group by 进行汇总,用 having把 count(字段) > 1的数据都显示出来,最后把查找到的重复数据 用min方法或者max方法获取最小id或者最大id来选择删除。

1、多字段转单字段

这里需要把id显示出来,后面有用到

SELECT id,CONCAT(`host`,path,params) AS uuid FROM static_url

2、把多字段合并为单字段

的查询结果放入子查询,查找存在重复的数据,并显示重复数

SELECT COUNT(a.id),a.uuid FROM (
    SELECT id,CONCAT(`host`,path,params) AS uuid FROM static_url
) a GROUP BY a.uuid HAVING COUNT(a.id) > 1

3、将查询到的重复id

来获取重复数据里最小的id

SELECT min(a.id) FROM (

     SELECT id,CONCAT(`host`,path,params) AS uuid FROM static_url

) a GROUP BY a.uuid HAVING COUNT(a.id) > 1

4、将获取到重复数据最小的id值

放入 IN内作为删除数据的条件

DELETE FROM static_url WHERE id IN(

    SELECT min(a.id) FROM (

        SELECT id,CONCAT(`host`,path,params) AS uuid FROM static_url

    ) a GROUP BY a.uuid HAVING COUNT(a.id) > 1

)

5、bug补充

如果直接执行步骤4的代码时,MySQL会卡住,会卡住,卡住,住!

虽然逻辑上来说没问题,但执行的时候嵌套过多子查询,就会出现问题,所以要把子查询数据拎出来再放入删除语句内

DELETE FROM static_url WHERE id IN(

   91383,26240,26256,26269,26129,26108,26029,26067,26095,26309,26595,51805,37459,32493,32417

)

6、将步骤4的代码多执行几次

直到执行结果显示没有删除到数据的时候才停止,因为重复数据不一定只重复一次,很可能重复好几次,每一次执行只能删除重复数据的最小id,不是只保留最大id

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL数据表合并去重的简单实现方法

    场景: 爬取的数据生成数据表,结构与另一个主表相同,需要进行合并+去重 解决:(直接举例) 首先创建两个表pep,pep2,其中pep是主表 CREATE TABLE IF NOT EXISTS `pep/pep2`( `id` INT UNSIGNED AUTO_INCREMENT, `no` VARCHAR(100) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; 然后向pep中插入两条数据,pep2中插

  • 详解mysql数据去重的三种方式

    目录 一.背景 二.数据去重三种方法使用 1.​通过MySQL DISTINCT:去重(过滤重复数据) 2.group by 3.row_number窗口函数 三.总结 一.背景 最近在和系统模块做数据联调,其中有一个需求是将两个角色下的相关数据​对比后将最新的数据返回出去,于是就想到了去重,再次做一个总结. 二.数据去重三种方法使用 1.​通过MySQL DISTINCT:去重(过滤重复数据) ​ 1.1.在使用 mysql SELECT 语句查询数据的时候返回的是所有匹配的行. SELECT

  • MySQL数据库学习之去重与连接查询详解

    目录 1.去重 2.连接查询 使用where进行多表连接查询 内连接 - 等值连接 内连接 - 非等值连接 内连接 - 自连接 外连接 - 左右外连接 三表连接 1.去重 示例表内容参考此文章 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 例如:去重显示岗位信息: mysql> select distinct job from emp; +-----------+ | job | +-----------+ | CLERK

  • Mysql删除重复的数据 Mysql数据去重复

    MySQL数据库中查询重复数据 select * from employee group by emp_name having count (*)>1; Mysql  查询可以删除的重复数据 select t1.* from employee t1 where (t1.emp_name) in (select t4.emp_name from (select t2.emp_name from employee t2 group by t2.emp_name having count(*)>1)

  • 浅谈sql数据库去重

    关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出. 关于sql去重最常见的有两种方式:DISTINCT和ROW_NUMBER(),当然了ROW_NUMBER()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的. 假如有张UserInfo表,如下图:   现在我们要去掉完全重复的数据:SELECT DISTINCT * FROM dbo.UserInfo结果如下图: 但是现在有个新的需求,要把名字为'张三'的去重,也就是相同名字的只要一条数

  • MySQL 数据查重、去重的实现语句

    有一个表user,字段分别有id.nick_name.password.email.phone. 一.单字段(nick_name) 查出所有有重复记录的所有记录 select * from user where nick_name in (select nick_name from user group by nick_name having count(nick_name)>1); 查出有重复记录的各个记录组中id最大的记录 select * from user where id in (se

  • SQL数据去重的3种方法实例详解

    目录 1.使用distinct去重 2.使用group by 3.使用ROW_NUMBER() OVER 或 GROUP BY 和 COLLECT_SET/COLLECT_LIST 3.1 ROW_NUMBER() OVER 3.2 GROUP BY 和 COLLECT_SET/COLLECT_LIST distinct与group by的去重方面的区别 使用去重distinct方法的示例详解 总结 1.使用distinct去重 distinct用来查询不重复记录的条数,用count(disti

  • MySQL中的多字段相同数据去重复

    目录 MySQL多字段相同数据去重复 1.多字段转单字段 2.把多字段合并为单字段 3.将查询到的重复id 4.将获取到重复数据最小的id值 5.bug补充 6.将步骤4的代码多执行几次 总结 MySQL多字段相同数据去重复 MySQL多字段去重复实际上是单字段去重复的衍生,原理就是把多字段数据通过子查询合并为单字段的数据表,再通过单字段数据group by 进行汇总,用 having把 count(字段) > 1的数据都显示出来,最后把查找到的重复数据 用min方法或者max方法获取最小id或

  • mysql中的保留字段产生的问题

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versio····这句话对于咱们并不陌生,无非就是多了","之类的问题.但是你如果无意之中添加了一个mysql中的保留字段作为数据库中存贮的字段名,悲剧就这样发生了. 前几天因为功能的临时变更,需要给数据表添加一个字段用来区别导入的批次,我就在mysql中添加了group字段,没想到我的噩梦就此展开·

  • python3实现往mysql中插入datetime类型的数据

    昨天在这个上面找了好久的错,嘤嘤嘤~ 很多时候我们在爬取数据存储的时候都需要将当前时间作为一个依据,在python里面没有时间类型可以直接拿来就用的.我们只需要在存储之前将时间类型稍作修饰就行. datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 如: #插入产品信息 insert_good_sql = """ INSERT INTO T_GOOD(good_name, good_type, img_

  • mysql中json类型字段的基本用法实例

    目录 前言 基本环境 JSON类型字段常用操作 插入JSON类型数据 查询JSON类型数据 更新JSON类型数据中的特定字段 匹配JSON类型数据中的特定字段 结语 前言 mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以对JSON类型字段中的特定的值进行查询和更新等操作,通过增加JSON类型的属性可以大大的提高我们在mysql表中存储的数据的拓展性,无需每次新增字段时都进行表结构的调整,下面我们不深入讲解底层的实现原理,我们主要来梳理一下我们在日常工作中使用实践 基本环境 my

  • 详解MySQL中数据类型和字段类型

    目录 1. mysql的数据类型 (1)数值型 (2)字符(串)型 (3)日期和时间型 (4)null值 2. mysql的列(字段)类型 2.1数值列类型 2.2字符串列类型 2.3日期时间列类型 1. mysql的数据类型 在mysql中有如下几种数据类型: (1)数值型 数值是诸如32 或153.4 这样的值.mysql 支持科学表示法,科学表示法由整数或浮点数后跟“e”或“e”.一个符号(“+”或“-”)和一个整数指数来表示.1.24e+12 和23.47e-1 都是合法的科学表示法表示

  • MySQL中datetime时间字段的四舍五入操作

    目录 前言 1.背景 2.模拟测试 3.结论 总结 前言 如果不是踩到坑,我估计到现在还不知道时间字段会四舍五入. 1.背景 通过 Java 代码获取当日最大时间,然后存入数据库,数据库表字段格式 datetime 保留 0 位. now.with(LocalTime.MAX) 小小的一行代码,获取今天的最大日期. 到数据库一看,好家伙,竟然存了第二天的时间. 看着样子是四舍五入了! 2.模拟测试 执行之后,看一下日志: 使用的是 2021-09-28T23:59:59.999999999,但是

  • asp.net DataTable相关操作集锦(筛选,取前N条数据,去重复行,获取指定列数据等)

    本文实例总结了asp.net DataTable相关操作.分享给大家供大家参考,具体如下: #region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// <summary> /// DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// eg:SortExprDataTable(dt,"Sex='男'","Time Desc&quo

  • MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍MySQL数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下SQL语句中的select语句的语法: Select 语句的基本语法: Select <列的集合> from <表名> where <条件> order by <排序字段和方式> 如果要查询某个表中的指定列的所有数据,则查询语句可以写作: select 列名1,列名2,列名3... from <表名> 要说明一个,这个语句后面仍然可以使用wher

  • MySql中的longtext字段的返回问题及解决

    目录 MySql中longtext字段的返回 如下图所示 解决方法 Mysql中Text字段的范围 汉字在utf8mb4中占用几个字符 MySql中longtext字段的返回 最近开发中用到了longtext这种字段.在mysql中该字段的最大长度为4G 如下图所示 开发中遇到的一个问题就是.例如有个article表,然后我们的页面要将数据以列表的形式展示到前端(只显示几个字段,如作者,标题等等,例如放到table中显示多条记录),但是是将该表中的所有信息都查出来,然后当用户点击某条记录的时候,

  • MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    目录 MybatisPlus保存.读取MySQL的json字段失败 场景 解决方案 Mybatis插入MySQL的json字段报错 解决办法 MybatisPlus保存.读取MySQL的json字段失败 场景 mybatis-plus保存mysql数据库,有字段为json,在java中定义字段为String,但是在保存的时候,json数据没有入库,为空,代码执行未报错. 解决方案 直接用对应的Object来做映射,然后增加对应的@TableField注解 @Data public class U

随机推荐