2013-04-16 112 views
1

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

UPDATE:

我需要,我在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....  | ..... ... .....    | 
+---------------------------------------------------------------------+ 

这是一个粗略的表格,我不能完全定义我的表,因为它有一轮50多
rows.Hope这个你明白我想要什么。
我这样粗略的查询。

DELECT all duplicate rows FROM foo 

编辑
我看到这个questoin被标记为duplicate.But我认为这是unique.The链接这个你比较它dulpicate.I看到这个链接,并存在被标记为有用的答案对于小型表格,它会对索引进行更改并创建唯一索引。这里是一个

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

代码如果您运行在此之后该查询时,无论你增加任何数据Mysql的检查,如果目前它停下来加入这个它已经存在。
我已经告诉过你,如果使用这个查询,我的表包含一个大数据,然后我在表格中添加一个结果,它检查我的整个表格,在这个表格的大约500000行中,这使得它变得很慢。只有一个新的记录,如果这是10或你的想法是什么,如果我想输入100000条新记录,它会变得太慢。
我看到其他答案大部分都包含HAVING class.It已经很慢了。

+0

请给我们您的架构信息,以便提供有用查询你使用。 – idipous

+0

没有足够的信息。但如果你谷歌的“SQL删除重复”,你会发现足够的自己找出来。 – dkretz

+0

更新了我的回复,并附上了您添加的表格详细信息。 – Kickstart

回答

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 
+0

对不起,错别字现在已修复(我希望!) – Kickstart

+0

感谢它的工作,但我改变了你的代码,像这样 'DELETE foo FROM foo INNER JOIN(SELECT link,MIN(id)AS MinId FROM foo GROUP BY link)b ON foo.link = b.link AND foo.id!= b.MinId' 我认为这样更快。 – Axeem

+0

这可能会更快,但如果(例如)Google有不同标题或说明的条目,那么它们将被视为1.这可能是也可能不是问题。 – Kickstart

0

使用脚本语言诸如Perl或Python

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

2)计算的校验和为应该是唯一的所有字段。例如,如果名称和成本应该只有每个唯一一个条目,则计算此校验和。如MD5哈希算法将是非常理想的

3)存储与“ID”或某种方式,该行可以被识别为每个校验后删除

4)具有规则的系统解决哪一个非唯一记录是允许的

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

6)执行删除命令

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

数据库只有50万行,以便存储ID信息和校验和是好最脚本语言

相关问题