频道栏目
首页 > 资讯 > SQL Server > 正文

sql删除重复数据操作记录

18-07-25        来源:[db:作者]  
收藏   我要投稿

来看看问题,表结构如下:

CREATE TABLE `consult` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID,自增',

`sku_id` bigint(20) NOT NULL COMMENT '商品ID',

`user_account` varchar(50) DEFAULT NULL COMMENT '用户ID,是一个字符串,并且唯一,',

`content` varchar(1000) DEFAULT NULL COMMENT '咨询内容',

`status` int(11) DEFAULT '1' COMMENT '1:表示新创建',

`is_deleted` int(11) NOT NULL DEFAULT '0' COMMENT '记录是否被删除:{1:已删除,0:未删除}',
`create_time` datetime DEFAULT NULL COMMENT '记录创建时间',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='咨询表';

可能是前台的代码有问题,表单重复提交,导致同一个用户(user_account)对同一个商品(sku_id)多次提交了重复的内容(content)。现在需要对重复的内容去重,即每一个用户,每一个商品只保留一条不同的内容。

条件是:

给定指定的sku_id,(10063,10061,10064)。

保留主键id最大的一条。

只需要update is_deleted字段为1,表示删除(即假删)

数据库是mysql。

解决方法:

1.先查询出每一个用户,对每一个商品,id最大的那条重复的数据。

查询结果如下:三个sku_id确只有两条数据,说明10064不存在一个用户重复提交的情况。

2.找出需要删除的id。

sql如上图,

c1.user_account=c2.user_account AND

c1.content=c2.content AND

c1.sku_id=c2.sku_id AND

c1.is_deleted=0

这四个条件约束了同一个商品,同一个用户,同一种内容。

c1.id < c2.id :由于c2.id是最大的id(在重复的数据里面),所以比他小的都应该被删除。

到此为止,所有需要删除的id都找出来了,剩下的就是update了,但是还有最后一个坑。

3.如果你直接update上面查出来的id,sql如下:

执行一下,你就会发现报错,错误如下:

[Err] 1093 - You can't specify target table 'consult' for update in FROM clause

原因: 在mysql里,在同一语句中,不能先select出同一表中的某些值,再update这个表。

怎么办呢?答案是让他产生临时表,select 临时表在update就没事了。

sql如下:

到此为此,删除重复数据就搞定了,希望能帮到你。

相关TAG标签
上一篇:MySQL常用的日期查询总结
下一篇:pgadmin工具栏的简单使用介绍
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站