删除除一条以外的所有重复记录

时间:2019-07-24 08:48:39

标签: mysql

我试图删除数据库中所有重复的记录,并维护一个唯一记录。

以下是我的查询:

SELECT * FROM reg02_maininfo INNER JOIN(
  SELECT farmername,farmermobile,rowuuid FROM reg02_maininfo GROUP BY concat(farmername,farmermobile) HAVING COUNT(concat(farmername,farmermobile)) > 1 order by concat(farmername,farmermobile))
  temp ON reg02_maininfo.farmermobile = temp.farmermobile and reg02_maininfo.farmername = temp.farmername;

以下是我的删除查询

DELETE s FROM reg02_maininfo s INNER JOIN(
  SELECT farmername,farmermobile,rowuuid FROM reg02_maininfo GROUP BY concat(farmername,farmermobile) HAVING COUNT(concat(farmername,farmermobile)) > 1 order by concat(farmername,farmermobile))
  temp ON s.farmermobile = temp.farmermobile and s.farmername = temp.farmername;

如何避免删除所有重复记录,而是维护唯一记录

2 个答案:

答案 0 :(得分:0)

因为我来自移动设备,所以没有检查语法,但是这样可以解决问题:

DELETE FROM reg02_maininfo WHERE rowuuid NOT IN (SELECT  
MIN(rowuuid) FROM reg02_maininfo GROUP BY 
concat(farmername,farmermobile))

因此,基本上,第一步是为每个组选择min rowuuid,然后删除其他行,以便每个组中都保留一个。

答案 1 :(得分:0)

对于具有重复行的concat(农民名,农民移动员),您可以尝试选择min rowudid并检查是否不计算rowid

    DELETE s 
    FROM reg02_maininfo s 
    INNER JOIN (
        SELECT concat(farmername,farmermobile)  name_mobile
        FROM reg02_maininfo 
        GROUP BY concat(farmername,farmermobile) 
        HAVING COUNT(concat(farmername,farmermobile)) > 1 
    ) t1 on t1.name_mobile = concat(s.farmername,s.farmermobile) 
    LEFT JOIN (
        SELECT min(rowuuid ) rowuuid
        FROM reg02_maininfo 
        GROUP BY concat(farmername,farmermobile) 
        HAVING COUNT(concat(farmername,farmermobile)) > 1 
    ) t pn t.rowuuid = s.rowuuid 
    where  t.rowuuid is null  

或假设concat(s.farmername,s.farmermobile,s.rowuuid)是有效的pk

    DELETE s 
    FROM reg02_maininfo s 
    INNER JOIN (
        SELECT concat(farmername,farmermobile,rowuuid)  my_pk
        FROM reg02_maininfo 
        GROUP BY concat(farmername,farmermobile) 
        HAVING COUNT(concat(farmername,farmermobile)) > 1 
    ) t1 on t1.my_pk = concat(s.farmername,s.farmermobile, rowuuid) 
    LEFT JOIN (
        SELECT min(concat(farmername,farmermobile,rowuuid) ) my_pk
        FROM reg02_maininfo 
        GROUP BY concat(farmername,farmermobile) 
        HAVING COUNT(concat(farmername,farmermobile)) > 1 
    ) t2 on t2.my_pk = (concat(s.farmername,s.farmermobile,s.rowuuid)
    where  t2.my_pk is null