2011-12-09 82 views
0

我正在使用以下查詢來查找重複記錄並驗證它是否正確運行。刪除`MySQL`中的重複項並保留單個記錄

SELECT MLS_LISTING_ID, STREET_NUMBER, STREET_NAME, UNIT_NUMBER, MLS_ID, SALE_PRICE, ZIP_CODE, TLN_REALTOR_ID, COUNT(mls_id) 
FROM idx_FM_BO_NA 
GROUP BY TLN_REALTOR_ID, STREET_NUMBER, STREET_NAME, UNIT_NUMBER, SALE_PRICE 
HAVING COUNT(distinct MLS_ID) > 1; 

如何更改此查詢以刪除重複項,以便只有一個記錄實例?我不擔心哪些記錄被刪除,但我需要其中一個留下來。

回答

2

我想這個答案是正確的:

delete from table1 USING table1, table1 as vtable 
WHERE table1.ID<vtable.ID AND table1.field_name=vtable.field_name 

這一個,paulsm4的答案之間的唯一區別是,IDS使用低於,而不是未equals進行比較。這樣,以後不會與以前的記錄進行比較(這意味着只保留一個相同的記錄)。我用我自己的數據測試了這一點,我需要這個數據,並且它工作。

0

這裏有一個簡單的解決方案:

http://www.cyberciti.biz/faq/howto-removing-eliminating-duplicates-from-a-mysql-table/

delete from table1 USING table1, table1 as vtable 
WHERE (NOT table1.ID=vtable.ID) AND (table1.field_name=vtable.field_name) 
  1. 在這裏,你告訴MySQL有一個table1的。
  2. 然後你告訴它你將使用table1和一個帶有table1值的虛擬表。
  3. 這將讓MySQL不會比較自己的記錄!
  4. 在這裏你告訴它,不應該有相同的field_name的記錄。
+0

所以在我的例子ID是TLN_REALTOR_ID,我會繼續增加FIELD_NAME且適用於休息模仿GROUP BY?這會刪除所有重複項還是留下一個實例? –

+0

我相信這將*不保留單個記錄,而是刪除所有具有重複項的行(包括它們的重複項)。我猜這是因爲第一行與第二行(顯然沒有相同的ID)進行比較,但第二行與第一行進行比較..所以兩者都被刪除。 –

0

下面的MySQL命令將創建的臨時表和 與由主鍵升序由一列名(即具有重複列 )和命令他們分組的所有列填充它。第二個命令 從臨時表中創建一個真實表。 第三條命令刪除正在使用的表,最後,最後的 命令將第二個臨時表重命名爲當前正在使用的 表名。

這是一個非常快速的解決方案。
下面是四個命令:

  1. CREATE TEMPORARY TABLE videos_temp AS SELECT * FROM videos GROUP by title ORDER BY videoid ASC;
  2. CREATE TABLE videos_temp2 AS SELECT * FROM videos_temp;
  3. DROP TABLE videos;
  4. ALTER TABLE videos_temp2 RENAME videos;
相關問題