欢迎投稿

今日深度:

sql删除重复数据操作记录,sql删除重复数据

sql删除重复数据操作记录,sql删除重复数据


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

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如下:

\

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

www.htsjk.Com true http://www.htsjk.com/Sql_Server/24596.html NewsArticle sql删除重复数据操作记录,sql删除重复数据 来看看问题,表结构如下: CREATE TABLE `consult` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,自增, `sku_id` bigint(20) NOT NULL COMMENT 商品ID, `user_ac...
评论暂时关闭