从Mysql表中删除重复行并仅保留一行

时间:2013-04-16 06:46:08

标签: mysql

我想从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被标记为重复。但我认为它是独一无二的。与此相关的链接dulpicate。我看到这个链接,并且有一个标记为小尺寸表有用的答案,它在索引中进行更改并使其独特指数。这是

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

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

2 个答案:

答案 0 :(得分: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 的每次出现都添加了相应的最大日期,并删除了添加最大日期不匹配的任何内容。

我认为你想保留最新记录。

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

编辑 - 版本与您现在提供的表格一致。这将删除重复项,只留下第一个相同的(即对于谷歌,你只剩下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

答案 1 :(得分:0)

使用脚本语言,如perl或python

1)执行查询以加载每一行

2)计算应该唯一的所有字段的校验和。例如,如果名称和成本每个唯一应该只有一个条目,则计算此校验和。像md5这样的散列算法对于这个

来说是理想的

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

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

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

6)执行删除命令

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

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