我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL如何去重

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL如何去重

这篇文章主要介绍了MySQL如何去重,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

需求分析

数据库中存在重复记录,删除保留其中一条(是否重复判断基准为多个字段)

解决方案

碰到这个需求的时候,心里大概是有思路的。最快想到的是可以通过一条sql语句来解决,无奈自己对于复杂sql语句的道行太浅,所以想找大佬帮忙。

找人帮忙

因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给同事,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...

自己百度

找到了一条sql语句:

DELETE
FROM
 vitae a
WHERE
 (a.peopleId, a.seq) IN (
  SELECT
   peopleId,
   seq
  FROM
   vitae
  GROUP BY
   peopleId,
   seq
  HAVING
   count(*) > 1
 )
AND rowid NOT IN (
 SELECT
  min(rowid)
 FROM
  vitae
 GROUP BY
  peopleId,
  seq
 HAVING
  count(*) > 1
)

这条语句是在 【MySQL中删除重复数据只保留一条】 这篇文章里找到的。这条sql思路很明显,有以下3步:

SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 查询出表中重复记录作为条件

SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 查询出表中重复记录中ID最小的值为第二个条件

最后根据以上两个条件,删除 重复记录中最小ID的其余重复记录

但是很无奈的是,运行这条语句出现了错误,大致报错意思是,不能在查询的时候同时更新这个表。

代码解决

根据上面这个sql语句想到或许可以通过代码的方式,两步来达到同样的目的:

先取出重复的数据集

根据查询到的数据集,循环删除其余的重复数据

想法是有了,写出来也很快,但是一运行吓我一跳,竟然需要 116s 左右,然后自己就想一定要找到可以使用的sql语句,贴一下代码和运行结果:

MySQL如何去重

MySQL如何去重

完美的【去重留一】SQL

最后在一个技术群里得到了完美的答案,看这条sql语句:

DELETE consum_record
FROM
 consum_record, 
 (
  SELECT
   min(id) id,
   user_id,
   monetary,
   consume_time
  FROM
   consum_record
  GROUP BY
   user_id,
   monetary,
   consume_time
  HAVING
   count(*) > 1
 ) t2
WHERE
 consum_record.user_id = t2.user_id 
 and consum_record.monetary = t2.monetary
 and consum_record.consume_time = t2.consume_time
AND consum_record.id > t2.id;

上面这条sql语句,仔细看一下,揣摩出思路也不难,大概也分为3步来理解:

(SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2 查询出重复记录形成一个集合(临时表t2),集合里是每种重复记录的最小ID

consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_time 关联 判断重复基准的字段

根据条件,删除原表中id大于t2中id的记录

看到这个语句的时候,心里想这也太厉害了。这么一个简单的sql语句,竟然可以解决这么复杂的问题,涨姿势了~

运行起来也超级快,原先的代码循环执行,需要 116s 左右,而这里 0.3s 就可以了,厉害了~

MySQL如何去重

感谢你能够认真阅读完这篇文章,希望小编分享的“MySQL如何去重”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL如何去重

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql如何按某列去重

使用DISTINCT关键字可以按某列去重。例如,假设有一个名为table_name的表,其中有一列为column_name,可以使用以下语句按该列去重:```sqlSELECT DISTINCT column_name FROM table
2023-08-30

mysql如何去掉重复记录

这篇文章主要介绍“mysql如何去掉重复记录”,在日常操作中,相信很多人在mysql如何去掉重复记录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql如何去掉重复记录”的疑惑有所帮助!接下来,请跟着小编
2023-02-28

mysql去重怎么去

mysql 中的数据去重方法有:distinct 关键字:消除重复行,仅保留不重复数据。group by 语句:分组后仅返回每个组中的第一个值。unique 索引:为特定列创建唯一索引,确保该列中的数据唯一。union all 操作符:合并
mysql去重怎么去
2024-05-30

MySQL如何查询重复记录并进行去重

可以使用以下方法来查询重复记录并进行去重:查询重复记录:SELECT column1, column2, COUNT(*)FROM table_nameGROUP BY column1, column2HAVING COUNT(*)
MySQL如何查询重复记录并进行去重
2024-03-06

sql中如何去重

sql 提供以下方法删除重复记录:1. distinct 关键字:选择唯一值一行。2. group by 子句:对数据分组,只返回每组一行(可结合聚合函数)。3. row_number() 函数:为每一行分配唯一行号,选择行号唯一的行。4.
sql中如何去重
2024-05-15

mysql怎么去重

mysql去重数据的5种方法:使用distinct关键字,仅保留唯一值;使用group by子句,根据指定列分组,只保留每组一行;使用窗口函数(mysql 8.0及以上),生成唯一行号并过滤为1的行;使用union all与distinct
mysql怎么去重
2024-05-16

js数组如何去重

小编给大家分享一下js数组如何去重,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在实际工作或面试中,我们经常会遇到“数组去重”问题,接下来就是使用js实现的数组去
2023-06-14

oracle如何去重查询

oracle 提供多种去重查询方法:distinct 关键字返回每列的唯一值。group by 子句对结果分组并返回每个分组的非重复值。unique 关键字用于创建仅包含唯一行的索引,查询该索引将自动去重。row_number() 函数分配
oracle如何去重查询
2024-06-13

MySQL如何实现连表查询分组去重

这篇文章主要介绍MySQL如何实现连表查询分组去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!业务逻辑通过多种渠道将小程序的活动页链接发布出去,比如通过多多种短信附带链接( channel 就记为 sms1,sms
2023-06-20

编程热搜

目录