【问题标题】:How to delete duplicate records in MySQL by retaining those fields with data in the duplicate item but not in the original item?如何通过保留重复项中的数据而不是原始项中的数据来删除 MySQL 中的重复记录?
【发布时间】:2023-04-09 08:41:01
【问题描述】:

我在 MySQL 表中有几千条记录,只有 100 个字段。

一些记录是重复的,并被标记为这样。现在,虽然我可以简单地删除欺骗,但我想保留原始记录版本中不存在的任何其他可能有价值的非空数据。希望我说得通。

例如:

a b c d e f key dupe
--------------------
1 d c f k l 1   x
2 g   h   j 1    
3 i   h u u 2
4 u r     t 2   x

从上面的示例表中,所需的输出是:

a b c d e f key dupe
--------------------
2 g c h k j 1
3 i r h u u 2

如果仔细观察,重复是通过使用 key 确定的(2 条记录相同,因此 dupe 字段为 'x' 的记录是通过保留一些来自欺骗的字段(如键 1 的 c、e 值)。

如果您需要有关这个令人费解的问题的更多信息,请告诉我。

非常感谢!

p.s : 如果无法使用 MySQL,那么 PERL/Python 脚本示例会很棒!谢谢!

【问题讨论】:

  • 对于给定的键值是否有超过 1 条重复记录?
  • 我猜这把钥匙并不是真正的“钥匙”(可能有一个血清门钥匙......)
  • 被骗的不会超过一个。它们成对存在。关键只是区分骗子。

标签: mysql duplicates duplicate-data duplicate-removal


【解决方案1】:

如果我理解正确,你需要 1)合并2条记录 2)删除标记的记录(很简单)。

要完成第一项任务,您可以使用类似

UPDATE table1 t1 
INNER JOIN table1 t2 ON (t1.key = t2.key AND t2.dupe='x')
SET t1.b= IFNULL(t1.b,t2.b), t1.c=IFNULL(t1.c,t2.c), ...etc
WHERE t1.dupe IS NULL

附:此查询假定任何记录有 0 或 1 个重复;如果有更多,则需要修改查询。

【讨论】:

  • 问题是有几百列。我试图避免对所有这些都进行低效的更新声明。我希望存在更好的解决方案。谢谢。
【解决方案2】:

使用代码,您可以合并行,然后删除重复项。

如果你想留在 sql 代码中 您需要在表的每一列上运行存储过程 仅当源行为空且目标行不为空时才更新源行。

使用某种游标迭代所有欺骗对。

这是一个笼统的想法,希望这里有人可以帮助您提供更具体的代码...

【讨论】:

  • 合并听起来像是一个计划。 Python 可能会这样做,但我是 Python 的初学者,不太确定如何将 Python Merge 应用于我的问题。感谢您的快速回复:)
【解决方案3】:

答案很大程度上取决于您实际想要做什么。您是要就地编辑重复记录,还是要创建具有所需结果的临时表。 如果你想要就地编辑记录,我认为你最好使用 python 来执行几个顺序查询,比如 a1ex07 说,然后简单的“从...删除... where dupe = 'x'”。如果你可以使用临时表,你可以使用一个(不是很)简单的 mysql 'INSERT INTO ... SELECT',用 IFNULL 或 CAOLESCE 合并重复记录,用 dupe = 'x' 合并实际忽略记录

【讨论】:

  • 临时表没有问题。唯一的问题是我不想手动更新所有一百列。
  • 好的,如果你没有临时问题,那么你可以使用类似'insert into tempTable (x) select coalesce (x1, (select x2 from sourceTable s2 where s2.keu = s1. key where s2.dupe = 'x') from sourceTable s1 where s1.dupe 'x' 但是如果您没有任何限制,我建议您编写带有 2-3 个查询的简单 python 脚本。跨度>
  • 非常感谢 Python 脚本。我没有限制!我正在尝试提出一个 Python 脚本,该脚本通过检查字段是否为空来遍历欺骗和非欺骗列表...请帮助:)
【解决方案4】:
import string, os, sys
import csv
import MySQLdb
import pickle
from EncryptedFile import EncryptedFile

enc = EncryptedFile( os.getenv("HOME") + '/.py-encrypted-file')
user = enc.getValue("user")
pw = enc.getValue("pw")

db = MySQLdb.connect(host="127.0.0.1", user=user, passwd=pw,db=user)

cursor = db.cursor()
cursor2 = db.cursor()

cursor.execute("select * from delThisTable")
rows = cursor.fetchall()
data = dict()
for row in rows:
    key, primary = row[0], row[1]
    if key not in data:
        data[key] = list(row[:-1])
    else:
        for i in range(len(row)-1):
            if data[key][i] is None or (not primary and row[i] is not None):
                data[key][i] = row[i]

Messa 在this 线程中回答...

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2022-01-10
    • 2010-10-14
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多