2017-01-20 35 views
0

這是我表:MySql的刪除具有重複的列行

domain  | ip 
-------------|----------- 
example.com | 0.0.0.0 
-------------|----------- 
example1.com | 1.1.1.1 
-------------|----------- 
example2.com | 2.2.2.2 
-------------|----------- 
example3.com | 3.3.3.3 
-------------|----------- 
example2.com | 9.9.9.9 
-------------|----------- 
example4.com | 4.4.4.4 
-------------|----------- 
example3.com | 3.3.3.3 
-------------|----------- 

我想刪除其中重複的域名,並保持知識產權的第一個值的行,所以我必須有表像這樣最後:

domain  | ip 
-------------|----------- 
example.com | 0.0.0.0 
-------------|----------- 
example1.com | 1.1.1.1 
-------------|----------- 
example2.com | 2.2.2.2 
-------------|----------- 
example3.com | 3.3.3.3 
-------------|----------- 
example4.com | 4.4.4.4 
-------------|----------- 
+1

你嘗試過什麼了嗎? – GurV

+0

是的。我用DISTINCT(domain)創建了一個新表,然後我嘗試運行一個php腳本,爲每個值獲取第一個IP值爲LIMIT 0,1的腳本,但由於我在數據庫中有超過400,000行。我不是一個mysql專家 – paulalexandru

+1

這與[此問題]類似(http://stackoverflow.com/questions/6103212/how-do-i-delete-duplicate-rows-and-keep-the-first-row)和其他StackOverflow –

回答

3

嘗試使用INET_ATONINET_NTOAGROUP BY獲得至少IP像這樣每個域:

SELECT 
    domain, INET_NTOA(MIN(INET_ATON(ip))) 
FROM 
    domains t1 
GROUP BY domain; 

MIN(IP)將無法​​正常工作,你所希望的方式。

您可以使用上述這樣執行刪除:

DELETE t1 FROM domains t1 
     INNER JOIN 
    (SELECT 
     domain, INET_NTOA(MIN(INET_ATON(ip))) ip 
    FROM 
     domains t1 
    GROUP BY domain) t2 ON t1.domain = t2.domain AND t1.ip <> t2.ip; 

請注意,如果有多個行與至少IP爲一個域,所有的人都將被保留。

您也可以創建一個新表來存儲不同行:

CREATE TABLE domains_new(domain varchar(100), IP varchar(30)) 
SELECT 
    domain, INET_NTOA(MIN(INET_ATON(ip))) 
FROM 
    domains t1 
GROUP BY domain; 
+0

這個選擇似乎很好。問題是,我想要刪除其餘的行,要麼將這些數據複製到一個單獨的相同的表。 – paulalexandru

+0

第二個查詢不起作用。它不會刪除足夠多的行。事情是,選擇作品。 – paulalexandru

+0

@paul不工作如何?我試過了,它刪除了行'example2.com | 9.9.9.9'。如果你用'example3.com |來說明兩行3.3.3.3''的值,我已經提到,在答案中,沒有辦法刪除那些,沒有創建一個臨時表,加載不同的數據,清除表和加載回來,或者只是選擇不同的 – GurV

0

所以刪除複本,假設你的表有一個名爲id一個主鍵,

DELETE FROM domains 
WHERE id IN 
(SELECT dyt.id FROM domains oyt, domains dyt 
WHERE oyt.id < dyt.id 
AND oyt.domain = dyt.domain 
AND oyt.ip = dyt.ip) 
+0

該表沒有任何主要ID,正如您在問題 – paulalexandru

+0

中看到的那樣使用「DISTINCT」創建新表可能是您最好的選擇。 – wogsland

0

創建具有相同結構的第二收集和嘗試。

INSERT INTO second_table SELECT DISTINCT * FROM domains 
0

如果分配各行的唯一ID

alter table domains add column id int first; 
set @i = 0; 
update domains set id=(@i:[email protected]+1); 

,那麼你也許可以做這樣的事情:

delete from domains 
where id not in (select id from 
(select id, domain, ip from domains group by domain having count(domain) > 1) as subq); 

則只是刪除鍵列

alter table domains drop column id; 
0

這應該工作:

WITH result AS (
    SELECT Domain, 
      Ip, 
      ROW_NUMBER() OVER (PARTITION BY p.Domain 
           ORDER BY p.Ip) AS rk 
     FROM DomainsTable p) 
SELECT r.Domain, r.Ip 
    FROM result r 
WHERE r.rk = 1