记一次sql删除重复数据的经历

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


可能是前台的代码有问题,表单重复提交,导致同一个用户(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如下:

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

猜你喜欢

转载自blog.csdn.net/u014801432/article/details/81178629