我的目标是从 ma_images 表中删除/删除任何行,这些行在另一行中包含同一数据的重复项,但保留已复制的该数据的原始/第一个实例。换句话说,如果第 1 行提到“image_1.jpg”,然后第 3、5 和 6 行也提到 dame data imageNameMaster 列,我想删除实例 3、5 和 6 但保留第一个实例(#1)'
我不擅长sql,现在已经在这方面工作了一天,谷歌搜索,阅读堆栈,研究,还没有找到一个我可以理解/与我的问题相关的示例来实现解决方案。
下面是我正在使用的表的示例,减去表中的一些额外列。下面是我迄今为止尝试过的最新的 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
)
最佳答案
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;
关于mysql - 如果列包含重复数据 SQL 则删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52459164/