2013-04-16 151 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信息和校驗和是好最腳本語言

相關問題