欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句的深入理解

程序员文章站 2023-10-11 18:31:09
正好想写一条删除重复语句并保留一条数据的sql,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 。如下: 表字段和数据: sql语句: delete from `use...

正好想写一条删除重复语句并保留一条数据的sql,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 。如下:

表字段和数据:

关于mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句的深入理解

sql语句:

delete from `user` where id not in(select * from(select id from `user` group by username)as b)  

理解:

先从里面的sql开始看

1、select id from `user` group by username 根据名字分组查询出每组的id。

2、select * from(select id from `user` group by username) as b 这句话中有2个疑问点,

第一、为什么要套这样一个select?因为 更新数据时使用了查询,而查询的数据又做更新的条件,mysql不支持这种方式

如果不套上这个select查询,那么将会报1093 - you can't specify target table 'user' for update in from clause错误。

第二、这句话中一定要取别名,不然会报1248 -every derived table must have its own alias 错误

3、结合上面的分析来看一下整个的sql语句理解,先将分组的id查出来,然后删除user表中id 不在分组id中的数据,那么就实现效果了。

delete from 表名 where id not in (select * from (select id from 表名 group by 分组的列名) 别名)

效果如下:

关于mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句的深入理解