我的目标是从ma_images表中删除/删除任何行,其中该行在另一行中包含同一数据的副本,但保留已复制的该数据的原始/第一个实例。换句话说,如果第1行提到“ image_1.jpg”,然后第3、5和6行也提到了dame数据imageNameMaster列,我想删除实例3、5和6,但保留第一个实例(#1)'
我对sql不好,并且已经花了一天的时间,用google搜索,阅读堆栈,进行了研究,还没有找到我可以理解/解决问题的示例以实现解决方案。
下面是我正在使用的表的示例,减去了表中的一些额外列。在此之下是到目前为止我尝试过的sql的最后一位,以及尝试产生的错误消息。
错误:您无法在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
)
答案 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;