我有一個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查詢將是首選。
我有一個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查詢將是首選。
我勸了2步的方法:
讓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
移除重複描述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萬個條目的表的主鍵。)
沒有測試過,所以請備份您的數據!
我沒有主鍵。 – user1911058
然後你應該添加一個。 'ALTER TABLE tablename ADD id INT PRIMARY KEY AUTO_INCREMENT' - 如果你確定不需要,你可以在程序結束後刪除它。 – Niko
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
);
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
注意:這也會刪除id_one = id_two的行。 – wildplasser
@wildplasser如何在id_one = id_two時刪除記錄。你能修改這個嗎? –
因爲對於'one = two',至少(1,2)等於最大(1,2) – wildplasser
在哪種語言? –
爲什麼'3,2'而不是'2,3'? –
php或mysql查詢將是首選。 @JW它實際上並不重要,他們在什麼順序。 – user1911058