首先检查辅助字段,删除Dupes

时间:2014-03-25 20:53:11

标签: mysql merge duplicates

我有一个带有字段的表(Name)我想创建一个唯一的索引,但似乎存在重复。我不想只是摆脱欺骗,因为有些人可能在我需要的其他领域有信息。基本上我有:

  • ID
  • PARENTID
  • 名称
  • RelatedID

所以目标1是我想保留除了ID和名称之外的辅助字段中具有值的记录。在大多数情况下,这只是一个骗局。

目标2是两个相同的名称都有值但在不同的字段中我想“合并”那些,因为远程可能一个副本将在一个关键字段中具有值而在另一个字段中具有一个值。

最后,目标3是两个名字都在关键字段中都有值的情况我可能想先手动查看这些值。

在我看来,我的第一步就是目标3;手动检查名称字段相同的重复项,并且一个记录在关键字段中具有非空/非空值。

一旦我解决了这个问题,我们的目标就是“仅仅”保留剩余的记录,即保留一条带有Name的记录和其他非空/非空的密钥字段。

任何想法都非常感激。

1 个答案:

答案 0 :(得分:0)

听起来像一个可靠的计划 - 希望你有一个开发环境,你可以干它运行。

以下是一些可以帮助您的代码

从第3步开始。 该声明应该可以帮助您找到需要审核的记录。

SELECT * 
FROM (
  SELECT name, 
    GROUP_CONCAT(DISTINCT parentID) AS parentID,
    GROUP_CONCAT(DISTINCT code) AS code,
    GROUP_CONCAT(DISTINCT RelatedID) AS RelatedID,
  FROM foo
  GROUP BY name
  HAVING COUNT(*)>1) as summarized
WHERE parentID LIKE '%,%'
  OR code LIKE '%,%'
  OR RelatedID LIKE '%,%';

在查询同一字段中存在多个值的原因后,您可能需要手动修复该查询中出现的任何内容。

一旦修复到位,合并的时间就到了。我会创建一个具有正确值的保持/临时表。 MAX应该注意选择非空值的逻辑

CREATE TABLE foo_values
SELECT name, MAX(parentID) as parentID, MAX(code) AS code, MAX(RelatedID) AS RelatedID.
FROM foo
GROUP BY name
HAVING COUNT(*)>1;

理论上,现在你有了合并的价值。您可以使用最适合的技术删除重复的名称行(请参阅here),同时添加唯一索引。最后,通过JOIN返回foo值来更新辅助字段。