删除mysql中所有重复的行
Posted
技术标签:
【中文标题】删除mysql中所有重复的行【英文标题】:Delete all duplicate rows in mysql 【发布时间】:2021-02-08 06:59:36 【问题描述】:我有从 csv 文件导入的 mysql 数据,上面有多个重复文件,
我使用 Distinct 功能选择了所有非重复项。
现在我需要使用 SQL 命令删除所有重复项。
请注意,我不需要任何重复项,我只需要获取中午的重复项
谢谢。
例如,如果数字 0123332546666 重复 11 次,我想删除其中的 12 个。
Mysql表格式
ID, PhoneNumber
【问题讨论】:
【参考方案1】:只需COUNT
重复的数量(使用GROUP BY
)并按HAVING
过滤。然后将查询结果提供给DELETE
语句:
DELETE FROM Table1 WHERE PhoneNumber IN (SELECT a.PhoneNumber FROM (
SELECT COUNT(*) AS cnt, PhoneNumber FROM Table1 GROUP BY PhoneNumber HAVING cnt>1
) AS a);
http://sqlfiddle.com/#!9/a012d21/1
完整的小提琴: 架构:
CREATE TABLE Table1
(`ID` int, `PhoneNumber` int)
;
INSERT INTO Table1
(`ID`, `PhoneNumber`)
VALUES
(1, 888),
(2, 888),
(3, 888),
(4, 889),
(5, 889),
(6, 111),
(7, 222),
(8, 333),
(9, 444)
;
删除查询:
DELETE FROM Table1 WHERE PhoneNumber IN (SELECT a.PhoneNumber FROM (
SELECT COUNT(*) AS cnt, PhoneNumber FROM Table1 GROUP BY PhoneNumber HAVING cnt>1
) AS a);
【讨论】:
【参考方案2】:您可以尝试将左连接与子查询结合使用,以获取与每个不匹配的电话号码广告相关的最小 ID 删除
delete m
from m_table m
left join (
select min(id), PhoneNumber
from m_table
group by PhoneNumber
) t on t.id = m.id
where t.PhoneNumber is null
否则,如果您想删除所有重复项而不保留至少一行,您可以使用
delete m
from m_table m
INNER join (
select PhoneNumber
from m_table
group by PhoneNumber
having count(*) > 1
) t on t.PhoneNumber= m.PhoneNumber
【讨论】:
op 想要全部删除,所以 left 加入是不必要的 答案已更新以删除所有重复的行 观察一下,加入就够了【参考方案3】:我建议不要从表中删除,而是创建一个新表:
create table table2 as
select min(id) as id, phonenumber
from table1
group by phonenumber
having count(*) = 1;
为什么?删除行有很多开销。如果您从外部源引入数据,则将第一个登陆表视为临时表,第二个作为最终表。
【讨论】:
以上是关于删除mysql中所有重复的行的主要内容,如果未能解决你的问题,请参考以下文章