Php 查找并删除后面的重复记录
我有一个大约有50万到100万条记录的表。该表有一个varchar字段的重复记录 差不多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作为基础
ID int(11)
TITLE varchar(100)
有许多记录具有重复的标题值
我需要删除重复的记录。第一步是找到它们。我想有两种方法:
按标题分组
从MY_表中选择ID和标题
逐个记录,然后对每个记录使用从MY_表中选择ID,其中标题='““$row['TITLE']”和ID'。$row['ID']”“
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