MySql删除具有重复列的行

时间:2017-01-20 19:47:19

标签: mysql sql distinct

这是我的表:

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
-------------|-----------

我想删除重复域的行并保留ip的第一个值,所以我最终必须有一个这样的表:

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
-------------|-----------

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)

答案 2 :(得分:0)

创建具有相同结构的第二个集合并尝试此操作。

INSERT INTO second_table SELECT DISTINCT * FROM domains

答案 3 :(得分:0)

如果为每一行分配唯一ID

alter table domains add column id int first;
set @i = 0;
update domains set id=(@i:=@i+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;

答案 4 :(得分: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