MySQL 删除重复行保留 none

MySQL delete duplicated rows keep none

我的 table 看起来像这样:

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

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

输出应如下所示:

Event_id Species
2 Dog
3 Cat
5 Cat

提前致谢!

一个简单的方法是:

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

下面查询return只存在一次的event_id。所以可以用条件event_id not in.

删除
select event_id
from my_tbl
group by event_id
having count(*) =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     |
+----------+---------+