如果列包含重复数据,则删除行

时间:2018-09-22 17:32:46

标签: mysql sql mysqli duplicates sql-delete

我的目标是从ma_images表中删除/删除任何行,其中该行在另一行中包含同一数据的副本,但保留已复制的该数据的原始/第一个实例。换句话说,如果第1行提到“ image_1.jpg”,然后第3、5和6行也提到了dame数据imageNameMaster列,我想删除实例3、5和6,但保留第一个实例(#1)'

我对sql不好,并且已经花了一天的时间,用google搜索,阅读堆栈,进行了研究,还没有找到我可以理解/解决问题的示例以实现解决方案。

下面是我正在使用的表的示例,减去了表中的一些额外列。在此之下是到目前为止我尝试过的sql的最后一位,以及尝试产生的错误消息。

example of table minus a lot of columns

错误:您无法在FROM子句中指定要更新的目标表'img'

delete img
from  ma_images AS img
where exists (
    select 1
    from ma_images ref
    where ref.ImgNameMaster = img.ImgNameMaster

        and ref.ImgID < img.ImgID
)

1 个答案:

答案 0 :(得分:2)

MySQL对在子查询中使用要更新/删除的表很挑剔。

最好的解决方案是使用join

delete img
    from ma_images img JOIN
         ma_images ref
         on ref.ImgNameMaster = img.ImgNameMaster and    
            ref.ImgID < img.ImgID;

此版本可能会尝试多次删除同一行。所以,我建议:

delete img
    from ma_images img JOIN
         (select ref.ImgNameMaster, MIN(ImgId) as min_ImgId
          from ma_images ref
          group by ref.ImgNameMaster
         ) ref
         on ref.ImgNameMaster = img.ImgNameMaster and    
            img.ImgID > ref.min_ImgID;