使用单个重复列从 MySQL 数据库中删除重复项 [重复]

Posted

技术标签:

【中文标题】使用单个重复列从 MySQL 数据库中删除重复项 [重复]【英文标题】:Deleting duplicates from a MySQL database with a single duplicate colum [duplicate] 【发布时间】:2013-10-07 02:37:33 【问题描述】:

所以我已经阅读了很多关于这个的 Stack Overflow 问题......我真的无法得到我的答案 :(。我只使用 mysql 大约 4 个月,所以我并不完全是一个亲。

不管怎样,我的表中的数据看起来与此类似...

id | user | amount

1 | dillyg10 | 16
2 | dillyg10 | 18

如您所见,用户字段被复制。这种情况在我的数据集中经常发生,虽然我的表很小,只有大约 1000 行。

所以,如果你们能给我一些建议......我将非常感激,也通过你在查询中所做的,我正在努力学习,希望我不必问这样的问题再次 :)。

【问题讨论】:

您表示要删除的两条记录中的哪一条?他们有不同的amount 值。你想怎么做?或者您只是不在乎保留哪条记录? 我要删除表中的第一条记录。 什么定义了两者的第一个记录? id 最低的那个。 【参考方案1】:

您可以使用以下查询删除重复记录。

DELETE FROM test_table
      WHERE ID IN (SELECT   MAX (ID)
                       FROM test_table
                   GROUP BY user);

【讨论】:

如果每个用户正好有两条重复记录,这是一个解决方案。如果还有更多并且应该还剩下一个,那么将 'where id in' 更改为 'where id not in' 将完成任务。 我尝试过这样做,但出现以下错误:您无法在 FROM 子句中指定目标表 'testingdupes' 进行更新。【参考方案2】:

如果您想从每个用户的重复行中删除除具有最大 id 的行之外的所有行,那么您可以这样做

DELETE t 
  FROM table1 t JOIN
(
  SELECT user, MAX(id) id
    FROM table1
   GROUP BY user
  HAVING COUNT(*) > 1
) q 
   ON t.user = q.user
  AND t.id <> q.id

这里是SQLFiddle演示

另一方面,如果您想在重复行中保留最大数量的行

DELETE t 
  FROM table1 t JOIN
(
  SELECT i.id, i.user, i.amount
    FROM
  (
    SELECT user, MAX(amount) amount
      FROM table1
     GROUP BY user
    HAVING COUNT(*) > 1
  ) p JOIN table1 i
      ON p.user = i.user
     AND p.amount = i.amount
) q 
   ON t.user = q.user
  AND t.amount <> q.amount
   OR (t.amount = q.amount
       AND t.id < q.id)

这里是SQLFiddle演示

【讨论】:

@user872129 到底有没有帮助?

以上是关于使用单个重复列从 MySQL 数据库中删除重复项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Left join 无法在单个查询中删除重复项

MYSQL - 将具有多个重复值的行组合起来,然后删除重复项

MySQL中删除重复数据只保留一条

MySQL中删除重复数据只保留一条

删除mysql中所有重复的行

按美元金额对 csv 列进行排序,然后删除重复项