在编写数据库转换脚本时,我遇到了一个存在重复记录的问题,我的目标是找到这些并删除重复项。我绝不是 SQL 方面的专家,所以请多多指教!
到目前为止,我找到并删除重复记录(如果 group_name 和级别)相同的最好方法就是这个
DELETE FROM achievements
WHERE group_name IN (SELECT concat(group_name, level)
FROM achievements
GROUP BY group_name, level
HAVING count(*) >1);
但它给了我以下错误
[Err] 1093 - Table 'achievements' is specified twice, both as a target for 'DELETE' and as a separate source for data
这是我当前的数据; https://gist.github.com/Diddyy/13842901c830c19c21488613c9d27c92
从该数据中有 3 个重复项(group_name 后跟级别);
ACH_CameraPhotoCount 5
ACH_FootballGoalScoredInRoom 1
ACH_FootballGoalScoredInRoom 2
我将这些归类为重复项,因为已经有一个具有相同名称和级别的条目。
我的最终结果是删除 3 个重复项,但每个都留下一个,因此它仍然存在。
注意,重复的组名是允许的。允许重复级别。但我不想要的是不止一次同级别的group_name。
我似乎无法为此提出解决方案,而且我不太确定 concat 是最好的方法吗?
欢迎任何解决方案,谢谢!
最佳答案
在 MySQL 中删除重复项的正常方法是使用 join
。以下删除多次出现的所有 group_name
:
delete a
from achievements a join
(select group_name, min(level) as minlevel
from achievements a
group by group_name
having count(*) > 1
) aa
on a.group_name = aa.group_name;
以下是比较常见的做法。它保留一个“重复”行,比如最低级别的行:
delete a
from achievements a join
(select group_name, min(level) as minlevel
from achievements a
group by group_name
having count(*) > 1
) aa
on a.group_name = aa.group_name
where a.level > aa.level;
编辑:
你可以用 group_name
和 level
做同样的事情:
delete a
from achievements a join
(select group_name, level, min(id) as minid
from achievements a
group by group_name, level
having count(*) > 1
) aa
on a.group_name = aa.group_name and a.level = aa.level
where a.id > aa.minid;
关于mysql - 从同一个表中选择和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442969/