MySql 删除具有重复列的行

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

最佳答案

尝试使用 INET_ATONINET_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;

关于MySql 删除具有重复列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771249/

相关文章:

mysql - Debian 找不到文件但显示该文件

mysql - MYSQL中存在空值时如何进行GROUP_CONCAT?

php - 更新 MySQL 字段时出错

sql - 具有多个 COUNT(DISTINCT xxx) 的 PL/SQL SELECT - 意外结果

php - 如何优化我的查询?

sql - 复式应计会计概念

sql - oracle中连接三张表或做嵌套sql语句

mysql - 如何在mysql上处理大数据查询并具有更好的性能

mongodb - 独特的MongoDB函数-如何使用与众不同的标准

mysql - 根据多个不同的值返回 mysql 行