mysql - 如何在 MySQL 中删除重复记录?

标签 mysql

这是一个艰难的过程。第三方一直在向我们发送来自第四方的数据。但他们这样做的方式很糟糕,他们弄乱并复制了许多数据。

现在数据都在一个表中,尽管它应该在多个表中。这与历史数据格式有关。

现在应该是每条记录与其他表中的多个相关记录,实际上按如下方式放入我们的数据库中:

Id HistoricalId Field1 Field2 Field3 Field4 FieldX ... 1 327 2 数据数据数据 3 数据数据数据 4 数据数据 5 数据数据 6 328 7 数据数据数据(等等等等)

一切都大大简化了。所以你总是首先有一种“标题记录”。然后记录数据。直到有一个新的标题。让我们将从一个标题到下一个标题的所有记录一起称为“ super 记录”(例如,在示例中,ID 1 t/m 5 一起形成第一个 super 记录,下一个 super 记录在 ID 6 处统计)。

问题是:有许多重复的“ super 记录”,很容易通过标题记录中重复的 HistoricalId 来识别。但它们可以在数据库中的任何地方(形成 super 记录的记录将被很好地排序并且不会混淆,但是 super 记录是混淆的)。

所以谜题:删除所有重复的 super 记录。如果不是更多的话,我们在这里谈论的是 10.000s。

那么,在 MySQL 中,你会如何:

  1. 从重复的 super 记录中找到一个 Id(简单)
  2. 从下一个头记录(即后面的 super 记录)中找到 Id
  3. 删除第一个 Id 和第二个 Id 减 1 之间(包括在内)的所有内容
  4. 并对所有重复的 super 记录执行此操作。

我的头开始旋转。只用 mySQL 肯定是可能的,但是怎么做呢?我只是经验不够。尽管我不擅长 MySQL,但在这里我什至不知道从哪里开始。或者我应该用 php 编写程序吗?

有人喜欢挑战吗?提前致谢!

更新:感谢您和两个小时的辛勤工作,解决了这个问题。参见解决方案。

最佳答案

如果您愿意复制到不同的表等,那么...

  1. 您可以确定要删除哪些记录。 historical-id 存在于具有更高 ID 的其他记录中的所有记录

    选择 id, HISTORICAL_ID 来自 tbl t1 WHERE historical_id>0 并且存在 (从 tbl t2 中选择 1 WHERE T2.hISTORICAL_id=T1.HISTORICAL_ID 和 T2.ID>T1.ID)

  2. 由于每条记录都有一个 ID,对于每条记录,您可以计算标题记录的 ID。 (这是您在评论中提到的内容)。这将是最大。来自填充了历史 ID 的任何“先前”记录的 ID。

    选择ID,HISTORICAL_ID ,(Select MAX(ID) FROM T2 Where T1.ID 0) 作为 PARENT_ID 来自TBL T1

  3. 然后您可以将 PARENT_ID 与第一个查询进行匹配,以获取您希望删除的所有 ID

关于mysql - 如何在 MySQL 中删除重复记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32567921/

相关文章:

php - 使用 $_GET 变量进行记录集查询

mysql - sql 将行分隔字符串的行转换为单独的行

php - TypeError : data. isbn 未定义

mysql - 从数据库中检索两个日期之间的时间段内的数据

java - 编译 MySQL Connector Jar 文件时 Android Studio preDexDebug 错误

php - 无法将 php 从本地主机详细信息更改为我的服务器以连接 sql 数据库

php - 将引导日期选择器中的日期插入 MySQL 日期字段不起作用

php - 为什么 num_rows 给出表中所有行的数量?

Mysql使用一个特定的主键自动增加一列

java - 数据库表不会使用 Maven 自动创建