删除重复的 MySQL 个条目

Remove duplicate MySQL entries

我还没有看到有人就这个具体问题寻求帮助。

我有一个 table,里面有 300,000 行。每行都有一个唯一的 id,几列,但没有时间戳等。

我遇到的问题是用户已设法将新数据导入数据库,因此现在有些行是重复的。

对于有此问题的行,有 2 行除了 ID 外完全相同。

有没有办法搜索整个 table,根据名称找到重复的行并删除具有旧 ID 的行?

我需要确保只删除一个重复项,并且只删除旧条目。

到目前为止,我已经想出了以下显示重复行的内容。

SELECT id, name, COUNT(name) AS cnt
FROM Sites
GROUP BY name
HAVING (cnt > 1)

这会产生 idnamecnt 的输出,并显示有 50,000 个条目要删除。显示的 ID 似乎是旧 ID。

是否可以将其输入删除命令以删除条目?

谢谢

假设旧 ID 的值较低,您可以使用 FIRST_VALUE 按名称分区(不熟悉您的 table)并按 ID 排序。

https://mariadb.com/kb/en/first_value/

据我了解,现在 table 中有两行重复,您想删除旧行或 ID 较小的行。

您可以 INNER JOIN 相同 table。

首先,确认要删除的所有行:

SELECT t1.* FROM Sites t1 
    INNER JOIN Sites t2 
    WHERE t1.name = t2.name 
    AND t1.id < t2.id

这应该只有 return 个 ID 较小的原始行

其次,如果所有 returned 行都是正确的,现在您可以使用该查询并获取每个 ID 并在 DELETE 语句

中使用它
DELETE * FROM Sites WHERE id IN (
    SELECT t1.id FROM Sites t1 
        INNER JOIN Sites t2 
        WHERE t1.name = t2.name
        AND t1.id < t2.id
)

您可以使用 table 中的 AND 添加更多列,以检查完全重复的行。

这似乎对我有用。

DELETE FROM Sites WHERE id IN (
 SELECT * FROM (
  SELECT id FROM Sites GROUP BY name HAVING COUNT(name) >= 2
 ) AS a
);

谢谢