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

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

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

DELETE
FROM
    dataplatform_bugdata_org
WHERE
    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 col1
FROM
    dataplatform_bugdata_legacy_org
WHERE
    thedate = '2017-07-10'
GROUP BY
    abb;

DELETE
FROM
    dataplatform_bugdata_legacy_org
WHERE
    resourceid NOT IN (SELECT col1 FROM tmp);

DROP TABLE tmp;

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

【mysql】删除重复数据只保留一条_第1张图片

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

如何解决呢?

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

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

你可能感兴趣的:(#,MySQL)