【问题标题】:MySQL delete duplicated rows keep none [closed]MySQL删除重复行保留一个[关闭]
【发布时间】: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

提前致谢!

【问题讨论】:

标签: mysql duplicates


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2016-10-28
      • 1970-01-01
      • 2015-09-27
      • 2013-03-11
      相关资源
      最近更新 更多