gpt4 book ai didi

mysql - 从同一个表中选择和删除

转载 作者:行者123 更新时间:2023-11-28 23:21:23 25 4
gpt4 key购买 nike

在编写数据库转换脚本时,我遇到了一个存在重复记录的问题,我的目标是找到这些并删除重复项。我绝不是 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_namelevel 做同样的事情:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com