MySql 删除具有重复列的行

pau*_*dru 2 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
-------------|-----------
Run Code Online (Sandbox Code Playgroud)

我想删除重复域的行并保留 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
-------------|-----------
Run Code Online (Sandbox Code Playgroud)

Gur*_*ngh 6

尝试使用INET_ATONand INET_NTOAwithGROUP BY来获取每个域的最少 IP,如下所示:

SELECT 
    domain, INET_NTOA(MIN(INET_ATON(ip)))
FROM
    domains t1
GROUP BY domain;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

请注意,如果某个域有多个行的 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;
Run Code Online (Sandbox Code Playgroud)