2013-01-06 69 views
0

我有一個MySQL表,它看起來是這樣的:刪除值

id_one  id_two 
1   2 
2   1 
3   2 
2   3 
4   5 
5   4 

我想刪除有兩個重複值inrespective行的列的他們在因此示例如下所示:

id_one  id_two 
1   2 
3   2 
5   4 

總共有超過1200萬行。任何想法,我應該如何做到這一點? PHP或MySQL查詢將是首選。

+0

在哪種語言? –

+0

爲什麼'3,2'而不是'2,3'? –

+0

php或mysql查詢將是首選。 @JW它實際上並不重要,他們在什麼順序。 – user1911058

回答

0

我勸了2步的方法:

  1. 讓id_one總是較小的值,也就是說,如果id_one大於id_two然後交換它們的值 - 考慮這樣的事情(從here拍攝):

    UPDATE tablename 
    SET id_one = (@temp:=id_one), id_one = id_two, id_two = @temp 
    WHERE id_one > id_two 
    
  2. 移除重複描述here

    DELETE tablename FROM tablename INNER JOIN 
        (SELECT min(primary_key) AS min_id, id_one, id_two FROM tablename 
        GROUP BY id_one, id_two 
        HAVING count(1) > 1) AS d 
    ON (d.id_one = tablename.id_one 
        AND d.id_two = tablename.id_two 
        AND d.min_id <> tablename.primary_key) 
    

    (我假設你會對持有1200萬個條目的表的主鍵。)

沒有測試過,所以請備份您的數據!

+0

我沒有主鍵。 – user1911058

+0

然後你應該添加一個。 'ALTER TABLE tablename ADD id INT PRIMARY KEY AUTO_INCREMENT' - 如果你確定不需要,你可以在程序結束後刪除它。 – Niko

0
DELETE FROM ztable zt 
WHERE zt.id_one > zt.id_two 
    AND EXISTS (
    SELECT * 
    FROM ztable tx 
    WHERE tx.id_one = zt.id_two 
     AND tx.id_two = zt.id_one 
    ) 
    ; 

在mysql中不起作用,因爲在mysql中你不能引用被更新或刪除的表。 既然你想備份副本,無論如何,你可以使用,而不是在EXISTS子查詢:

CREATE table safetable AS (SELECT * from ztable); 

DELETE FROM ztable zt 
WHERE zt.id_one > zt.id_two 
AND EXISTS (
    SELECT * 
    FROM safetable tx 
    WHERE tx.id_one = zt.id_two 
    AND tx.id_two = zt.id_one 
    ); 
1
DELETE a 
FROM table1 a 
LEFT JOIN 
    (
     select id_one, id_two 
     from Table1 
     GROUP BY least(id_one, id_two), greatest(id_one, id_two) 
    ) b ON a.id_one = b.id_one AND a.id_two = b.id_two 
WHERE b.id_two IS NULL 
+0

注意:這也會刪除id_one = id_two的行。 – wildplasser

+0

@wildplasser如何在id_one = id_two時刪除記錄。你能修改這個嗎? –

+0

因爲對於'one = two',至少(1,2)等於最大(1,2) – wildplasser