2016-02-05 43 views
1

此表只有2列。當兩行的列匹配時,有行被認爲是「重複的」。MySQL的 - 如何刪除重複的行(但離開1行)給出2列?

即:

col1 col2 
X X 
X X 
X Y -- this is not a duplicate 

我想刪除重複,但留給他們的至少一個。無所謂,因爲它們是同一件事。

我已經使用INJOIN的變體,但我似乎無法獲得DELETE外部查詢只刪除具有重複列的每一行中的一個。

+0

你的PRIMARY KEY是什麼?和哪個版本的MySQL? – Strawberry

+0

[刪除MySQL中的重複行]可能的重複(http://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql) – Jens

+0

沒有主鍵。並且版本:5.5.35-0ubuntu0.12.04.2 – CMCDragonkai

回答

1

試試這個:

DELETE a 
FROM mytable a 
     LEFT JOIN 
     (
      SELECT MIN(ID) ID, col1, col2 
      FROM mytable 
      GROUP BY col1, col2 
     ) b ON a.ID = b.ID AND 
       a.col1 = b.col1 AND 
       a.col2 = b.col2 
WHERE b.ID IS NULL 

DEMO

假設ID作爲主鍵列

編輯:

不過,如果你沒有這個編號C olumn那麼你可以嘗試這樣的:

ALTER IGNORE TABLE mytable 
    ADD UNIQUE INDEX all_columns_uq 
    (col1, col2) ; 

DEMO

+1

「此表只有2列。」 – Arth

+1

@位置: - 感謝您指出。更新了我的答案。 –

1
ALTER IGNORE TABLE table1 ADD UNIQUE INDEX idx_name (col1,col2); 

OR

CREATE TABLE table1_temp AS 
SELECT * FROM table1 GROUP BY col1, col2; 

TRUNCATE TABLE table1; 
INSERT INTO table1 SELECT * FROM table1_temp; 

DROP TABLE table1_temp; 

您可以在現場的桌面第二種方法雖然也可以是任何其他丟失數據引用它的表可能不太高興!

我建議添加獨特的索引,以便將來證明自己。

+0

@strawberry請不要編輯我的答案,以刪除大塊的文本,並做出自己的首選/表面變化..如果你想建議更改添加評論。 – Arth