【mysql】删除重复数据只保留一条

来源:互联网 发布:网络教育花钱能包过吗 编辑:程序博客网 时间:2024/04/28 21:25

在SWQA平台中,BUG数据写入数据库的逻辑是每天进行读写一次,若该天是第二次进行写入该天的数据,则应将该天的数据首先删除后再进行写入
但是出现了一个BUG,数据未删除时已写入数据
需要把数据库中重复的数据删除

删除表中多余的重复记录,重复记录是根据单个字段(abb)来判断,只留有resourceid最小的记录

DELETEFROM    dataplatform_bugdata_orgWHERE    abb IN (        SELECT            abb        FROM            dataplatform_bugdata_org        GROUP BY            abb        HAVING            count(abb) > 1    )AND resourceid NOT IN (    SELECT        min(resourceid)    FROM        dataplatform_bugdata_org    GROUP BY        abb    HAVING        count(resourceid) > 1)

执行时,出现问题

[Err] 1093 - You can't specify target table 'dataplatform_bugdata_org' for update in FROM clause

不能先select出同一表中的某些值,再update这个表(在同一语句中)

故需要建立一个临时的表,然后再进行删除

CREATE TABLE tmp AS SELECT    min(resourceid) AS col1FROM    dataplatform_bugdata_legacy_orgWHERE    thedate = '2017-07-10'GROUP BY    abb;DELETEFROM    dataplatform_bugdata_legacy_orgWHERE    resourceid NOT IN (SELECT col1 FROM tmp);DROP TABLE tmp;

这个时候又发现另外一个问题:

这里写图片描述

该abb有四个数据,其中两对重复数据,一组是newbug,一个是closebug,如果min(resourceid) 那么只剩下一个数据,这个和需要删除的需求不符合,只是需要删除newbug中和closebug中重复的数据

如何解决呢?

  • 分别删除不同类型的type数据
CREATE TABLE tmp AS SELECT    min(resourceid) AS col1FROM    dataplatform_bugdata_legacy_orgWHERE    thedate = '2017-07-10' AND type = 'newbug'GROUP BY    abb;
  • 分组多个条件判断
SELECT min(resourceid),abb,typeFROM    dataplatform_bugdata_orgWHERE    thedate = '2017-07-10'GROUP BY abb,type

两种方法都能解决删除重复数据的问题

原创粉丝点击