这是我的域表:
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
-------------|-----------
答案 0 :(得分:3)
尝试将INET_ATON
和INET_NTOA
与GROUP 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