MySQL删除重复行保留一个[关闭]

Posted

技术标签:

【中文标题】MySQL删除重复行保留一个[关闭]【英文标题】:MySQL delete duplicated rows keep none [closed] 【发布时间】:2021-12-28 14:19:13 【问题描述】:

我的桌子是这样的:

Event_id Species
1 Dog
1 Horse
2 Dog
3 Cat
4 Fish
4 Bird
5 Cat

我不想保留任何具有重复 event_id 的行,因为我无法确定事件的物种类型。如何在mysql中删除表的两行?我没有每行的唯一 ID。

输出应如下所示:

Event_id Species
2 Dog
3 Cat
5 Cat

提前致谢!

【问题讨论】:

重复,但在数据库管理员上见dba.stackexchange.com/questions/69592 到目前为止您尝试过什么?你被困在哪里了? 【参考方案1】:

这是我在 MySQL 8.0 上测试的一个解决方案(使用with 需要):

mysql> create table mytable (event_id int, species varchar(20));
mysql> insert into mytable (Event_id,Species) values (1,'Dog'), (1,'Horse'), 
    (2,'Dog'), (3,'Cat'), (4,'Fish'), (4,'Bird'), (5,'Cat');

mysql> with cte as (select event_id from mytable group by event_id having count(*)>1) 
    delete mytable from mytable join cte using (event_id);

mysql> select * from mytable;
+----------+---------+
| event_id | species |
+----------+---------+
|        2 | Dog     |
|        3 | Cat     |
|        5 | Cat     |
+----------+---------+

【讨论】:

【参考方案2】:

一个简单的方法是:

delete t1 
from my_tbl as t1  
inner join  (  select event_id
               from my_tbl
               group by event_id
               having count(*) >1 
              )as t2 
on t1.event_id=t2.event_id;

演示:https://www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/155

或者使用sybquery:

delete from my_tbl  
where event_id not in ( select t1.event_id from (select event_id
                                              from my_tbl
                                              group by event_id
                                              having count(*) =1) as t1
                      ) ;

演示:https://www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/151

以下查询返回仅存在一次的 event_id。所以你可以删除条件event_id not in

select event_id
from my_tbl
group by event_id
having count(*) =1

【讨论】:

以上是关于MySQL删除重复行保留一个[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查询重复数据并按条件删除重复行

mysql删除重复数据,保留一条

pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)

mysql 删除重复的数据保留一条

Pandas:如何删除重复的行,但保留所有行的最大值[重复]

pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行并设置keep参数保留重复行中的最后一个数据行