1

我想从 Mysql 表中删除所有重复的行。
但问题是我不知道哪些行是重复的。
这个 Mysql 表包含大约 500000 行的大数据。
其中一些行是重复的。
请指导我如何做到这一点。

更新:

我需要在 phpMyAdmin 中运行的 SQL 查询。
这是一个粗略的表格,可以理解。
假设表名是foo

+---------------------------------------------------------------------+
| id |   link  |     title              |  description                |
+---------------------------------------------------------------------+
| 1  |  google |     search engine      |  search here free           |  
| 2  |  yahoo  |    also search engine  | findout web easily          |  
| 3  | Facebook|  connect with world    | meet with world             |  
| 4  | google  |  search engine         |  search here free           |
| 5  | msn     | Microsoft network      | network by MS               |
| 6  | google  | search engine          |  search here free           |
| 7  | msn     | Microsoft network      | network by MS               |
| 8  | yahoo   |  also search engine    | findout web easily          |
| 9  | myweb   |  my website            | ideal website               |
|... | ....    | .....continue....      | ..... ... .....             |
+---------------------------------------------------------------------+   

这是一张粗略的表,我无法完全定义我的表,因为它大约有 500000
行。希望这能理解你我想要什么。
我这样粗略查询。

DELECT all duplicate rows FROM foo

编辑
我看到这个 questoin 被标记为重复。但我认为它是唯一的。与这个链接你比较它是重复的。我看到这个链接并且有一个答案标记为对小尺寸表有用它会更改索引并制作唯一索引。这是那个的代码

  ALTER IGNORE TABLE jobs ADD UNIQUE INDEX idx_name (site_id, title, company );  

如果您在添加任何数据时运行此查询,Mysql 检查它是否已经存在或不存在,如果存在它会停止添加。
我已经告诉过您,如果使用此查询,我的表包含大量数据,然后我在表中添加一个结果,它会检查我的整个表,其中大约 500000 行使其唯一,这使它变慢。它只有一个如果这是 10 条新记录,或者如果我想输入 100000 条新记录,你的想法是什么,它太慢了。
而且我看到其他答案中的大多数都包含类HAVING。它已经很慢了。

4

2 回答 2

7

您可能可以在 DELETE 中使用 JOIN 来连接子选择。

需要更多细节才能提供更多帮助,但对于一个粗略的想法:-

DELETE result 
FROM result
INNER JOIN (SELECT SomeField, COUNT(*) AS RecCount, MAX(DateAddded) AS MaxDateAdded FROM result GROUP BY SomeField) b
ON result.SomeField = b.SomeField AND a.DateAdded != b.MaxDateAdded

这是查找SomeField的每一次出现,并添加了相应的最大日期,并删除在添加的最大日期不匹配的任何地方。

我假设你想保持最新的记录。

请注意,像这样的大规模删除有点令人担忧,因为如果您弄错了,您可能会删除所有记录。

编辑 - 与您现在给出的表格一起使用的版本。这将删除重复项,只留下第一个相同的(即对于 Google,您只剩下 id 为 1 的行)

DELETE foo 
FROM foo
INNER JOIN (SELECT link, title, description, MIN(id) AS MinId FROM foo GROUP BY link, title, description ) b
ON foo.link = b.link
AND foo.title = b.title 
AND foo.description = b.description
AND foo.id != b.MinId
于 2013-04-16T07:29:55.660 回答
0

使用脚本语言,例如 perl 或 python

1)做一个查询来加载每一行

2) 计算所有应该唯一的字段的校验和。例如,如果 name 和 cost 每个唯一值应该只有一个条目,请计算校验和。像 md5 这样的散列算法将是理想的

3) 使用“id”或某种方式存储每个校验和,以便可以识别该行以供以后删除

4) 有一套规则系统来解决允许一组非唯一记录中的哪一个记录

5)一旦查询处理完成并找到所有重复项,使用规则和 id / checksums 集生成 SQL 删除命令(或删除命令集)

6) 执行删除命令

7)改变你的数据库结构,所以有一个独特的约束来防止这种情况再次发生

该数据库只有 500 000 行,因此存储 id 信息和校验和在大多数脚本语言的能力范围内

于 2013-04-16T07:09:19.047 回答