新浦京81707con > 首页 > 一条sql语句完成MySQL去重留一,mysql去除重复数据

原标题:一条sql语句完成MySQL去重留一,mysql去除重复数据

浏览次数:142 时间:2019-12-05

一条sql语句完成MySQL去重留后生可畏,sqlmysql

前天在做二个要求的时候,需求清理mysql中再次的记录,那个时候的主见是因此代码遍历写出来,然后认为太复杂,心里想着应该能够透过一个sql语句来化解难题的。查了素材,请教了大佬之后得出了五个很有利的sql语句,这里享用下这段sql语句和思路。

须要分析

数据库中留存重复记录,删除保留此中一条(是还是不是再次评定榜样为多少个字段)

减轻方案

超越这一个需求的时候,心里大约是有思路的。最快想到的是足以经过一条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语句,贴一下代码和平运动行结果:

图片 1

图片 2

宏观的【去重留一】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大于t第22中学id的记录

观看那么些讲话的时候,心里想那也太厉害了。这么叁个轻巧易行的sql语句,竟然能够解决那样复杂的标题,涨姿势了~

运营起来也相当的慢,原先的代码循环施行,供给 116s 左右,而这里 0.3s 就足以了,厉害了~

图片 3

总结

用作四个php技术员,按理来讲sql这里是无法拖后腿的,万般无奈实际中,需求辛勤的业务太多,今后的sql水平也只是处在在一个平日性的层系中,今后找时机料定要补一下那上头的文化。

即日就享受到此地呀。

今日在做四个要求的时候,须要清理mysql中另行的笔录,那时的主见是由此代码遍历写出来,然后觉...

 结果:

 

SELECT * FROM testdelete a 
WHERE (a.one,a.two,a.three) IN (SELECT ONE,two,three FROM testdelete GROUP BY ONE,two,three HAVING COUNT(*) > 1) 

 

 

消除办法:将查询包装生机勃勃层:

 

mysql> desc testdelete;
 ------- ------------- ------ ----- --------- ---------------- 
| Field | Type        | Null | Key | Default | Extra          |
 ------- ------------- ------ ----- --------- ---------------- 
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| one   | varchar(40) | YES  |     | NULL    |                |
| two   | varchar(40) | YES  |     | NULL    |                |
| three | varchar(40) | YES  |     | NULL    |                |
 ------- ------------- ------ ----- --------- ---------------- 
4 rows in set (0.10 sec)

 

 

 

查看表布局:

DELETE
FROM testdelete
WHERE ONE IN(SELECT
               ONE
             FROM (SELECT
                     ONE
                   FROM testdelete
                   GROUP BY ONE
                   HAVING COUNT(ONE) > 1) a)
    AND id NOT IN(SELECT
                    *
                  FROM (SELECT
                          MIN(id)
                        FROM testdelete
                        GROUP BY ONE
                        HAVING COUNT(ONE) > 1) b)
mysql> select * from testdelete;
 ---- ------ ------ ------- 
| id | one  | two  | three |
 ---- ------ ------ ------- 
|  1 | A    | A    | A     |
|  2 | B    | B    | B     |
|  3 | C    | C    | C     |
|  4 | D    | D    | D     |
|  5 | E    | E    | E     |
|  6 | A    | A    | B     |
| 12 | A    | A    | A     |
| 13 | A    | A    | A     |
| 14 | A    | A    | A     |
| 15 | A    | A    | A     |
 ---- ------ ------ ------- 
10 rows in set (0.00 sec)

 

 

 

 结果:

 

 

图片 4

DELETE
FROM testdelete
WHERE ONE IN(SELECT
               ONE
             FROM testdelete
             GROUP BY ONE
             HAVING COUNT(ONE) > 1)
    AND id NOT IN(SELECT
                    MIN(id)
                  FROM testdelete
                  GROUP BY ONE
                  HAVING COUNT(ONE) > 1)

结果:

案由:大约是因为不能够间接在查询的说话中张开操作。

 

将数据恢复生机。 

 

 

(4 row(s) affected)
Execution Time : 00:00:00:125
Transfer Time : 00:00:00:000
Total Time : 00:00:00:125

 

查看数据:

 

 2.剔除表中的重复记录:(依照单列删除且保留ID最小的一条)

本文由新浦京81707con发布于首页,转载请注明出处:一条sql语句完成MySQL去重留一,mysql去除重复数据

关键词: 新浦京81707con

上一篇:2013快速入门手册之四,PPT中的插入

下一篇:没有了