Php 查找并删除后面的重复记录

Php 查找并删除后面的重复记录,php,mysql,sql,duplicates,Php,Mysql,Sql,Duplicates,我有一个大约有50万到100万条记录的表。该表有一个varchar字段的重复记录 差不多 ID int(11) TITLE varchar(100) 有许多记录具有重复的标题值 我需要删除重复的记录。第一步是找到它们。我想有两种方法: 使用计数(*)大于1的按标题分组 使用从MY_表中选择ID和标题逐个记录,然后对每个记录使用从MY_表中选择ID,其中标题='““$row['TITLE']”和ID'。$row['ID']”“ 问题是哪种方法是有效的 还是有其他更有效的方法 我使用php作为基础

我有一个大约有50万到100万条记录的表。该表有一个varchar字段的重复记录

差不多

ID int(11)
TITLE varchar(100)
有许多记录具有重复的标题值

我需要删除重复的记录。第一步是找到它们。我想有两种方法:

  • 使用计数(*)大于1的
    按标题分组

  • 使用
    从MY_表中选择ID和标题
    逐个记录,然后对每个记录使用
    从MY_表中选择ID,其中标题='““$row['TITLE']”和ID'。$row['ID']”“

  • 问题是哪种方法是有效的

    还是有其他更有效的方法

    我使用php作为基础语言。

    使用下面的sql

    DELETE FROM MY_TABLE WHERE ID NOT IN (SELECT MIN(x.ID) FROM MY_TABLE x GROUP BY x.TITLE);
    
    使用下面的sql语句

    DELETE FROM MY_TABLE WHERE ID NOT IN (SELECT MIN(x.ID) FROM MY_TABLE x GROUP BY x.TITLE);
    

    要删除所有重复记录(标题相同),您可以使用以下查询:

    DELETE B
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    DELETE A
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    删除B
    从你的桌子A
    内部连接A.TITLE=B.TITLE和A.ID
    此查询将删除后面的所有重复记录,同时保留第一个记录


    为了在删除以前所有重复记录的同时保留最新记录:

    DELETE B
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    DELETE A
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    删除一个
    从你的桌子A
    内部连接A.TITLE=B.TITLE和A.ID

    编辑:

    DELETE B
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    DELETE A
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    如果要在执行删除操作之前查看要删除的后续(重复)记录,请运行以下查询:

    SELECT B.*
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    选择B*
    从你的桌子A
    内部连接A.TITLE=B.TITLE和A.ID


    这假设所有新ID都将大于以前的ID。A. 这是一个相当安全的假设,但需要谨慎


    感谢@xQbert的添加。

    要删除所有重复记录(标题相同),您可以使用以下查询:

    DELETE B
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    DELETE A
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    删除B
    从你的桌子A
    内部连接A.TITLE=B.TITLE和A.ID
    此查询将删除后面的所有重复记录,同时保留第一个记录


    为了在删除以前所有重复记录的同时保留最新记录:

    DELETE B
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    DELETE A
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    删除一个
    从你的桌子A
    内部连接A.TITLE=B.TITLE和A.ID

    编辑:

    DELETE B
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    DELETE A
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    如果要在执行删除操作之前查看要删除的后续(重复)记录,请运行以下查询:

    SELECT B.*
    FROM your_table A 
    INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.
    
    选择B*
    从你的桌子A
    内部连接A.TITLE=B.TITLE和A.ID


    这假设所有新ID都将大于以前的ID。A. 这是一个相当安全的假设,但需要谨慎



    感谢@xQbert的添加。

    您想删除哪一个?后一个还是前一个?后一个会很好,您要删除哪一个?后一个还是前一个?后一个会很好我理解最内部的查询,它给出了所有不应该删除的ID,无论它们是否重复。。。但我不明白两件事。。。第一,这就是为什么要使用另一个
    SELECT*FROM(…)y
    。。。?第二,这就是为什么要用x。在最内部的查询中?当我对3000万条记录使用此查询时,出现了一些错误。如果没有收到1093错误,可以跳过此部分。而且,如果您想使用此查询查看要删除的记录,只需在同一查询中将
    delete
    替换为
    SELECT
    ,然后运行查询。我了解最内部的查询,它提供了所有不应删除的ID,无论它们是否重复。。。但我不明白两件事。。。第一,这就是为什么要使用另一个
    SELECT*FROM(…)y
    。。。?第二,这就是为什么要用x。在最内部的查询中?当我对3000万条记录使用此查询时,出现了一些错误。如果没有收到1093错误,可以跳过此部分。而且,如果您想使用此查询查看要删除的记录,只需在同一查询中将
    delete
    替换为
    SELECT
    ,然后运行查询。在运行实际删除之前,是否有办法查看哪些记录将被删除。。。可以选择B.*。。。可以吗?…请检查编辑部分下的更新答案。我认为这是一个有用的答案,我会尝试一下,然后接受。。。谢谢。这假设所有新ID都比以前的ID大。这是一个相当安全的假设,但需要谨慎。这非常有效。。。而且新的ID比以前的更大,所以它可以工作。。。感谢您提供的提示@xqbert在我运行实际删除之前,是否有办法查看哪些记录将被删除。。。可以选择B.*。。。可以吗?…请检查编辑部分下的更新答案。我认为这是一个有用的答案,我会尝试一下,然后接受。。。谢谢。这假设所有新ID都比以前的ID大。这是一个相当安全的假设,但需要谨慎。这非常有效。。。而且新的ID比以前的更大,所以它可以工作。。。谢谢你的提示@xQbert