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

标签 mysql sql

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

相关文章:

mysql - 找不到与列列表匹配的 FULLTEXT 索引

php - 如何在 laravel 5.4 中为所有请求和响应设置日志

MySQL/MariaDB 在使用 utf8mb4 时无法处理唯一键

Select 中的 MySQL 程序?

php - 如何使用 php 和 html 在我的博客上显示两个 sql 表的信息

sql - 几乎相同值的日期比较

mysql - 选择一个值并将其设置在mysql中的变量中

php - Codeigniter - 将 mysql 表同步到不同服务器上的不同数据库

MySQL 在表中的多个列的多个条件上使用 Select

mysql - mysql中如何根据另一个表从一个表中进行select