如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?

Posted

技术标签:

【中文标题】如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?【英文标题】:How to compare every record to another record(name reverse problem) and erase duplicates one? 【发布时间】:2020-02-17 19:40:35 【问题描述】:

我很难识别唯一记录(值)。 我有一张这样的桌子:

ID NAME            DESCRIPTION
1  Yanagida Fumit  best author
2  Ha Il-kwan      new author
3  Fumit Yanagida  best author
4  Ha Il Kwan      new author
5  Ilkwan Ha       new author

在同一个名为autho 的表中有5 条记录。但实际上,有 2 个作者。 第一条记录和第三条记录是从一个作者信息中存储的,第二条、第四条和第五条是一个作者。 我想像下面这样。

ID NAME            DESCRIPTION
1  Yanagida Fumit  best author
2  Ha Il Kwan      new author

这意味着,我将针对 reverse name problem 删除所有重复项。 我想知道我是否可以比较同一列中的两个值(字符串)。 请帮帮我。我会很高兴得到您的任何帮助!

【问题讨论】:

你想使用 levenshtein distance 来解决这个问题。 转换为 SET,其中每一位都是一个确定的字母。这足以识别 >95% 的重复项。 @Mech 感谢您的快速回答!您介意进一步详细解释一下 levenshtein 距离吗? 我在堆栈上找到了类似的解决方案,但我认为我没有正确使用它:) dbfiddle.uk/… 谢谢大家!我很高兴你的帮助。我第一次面对levenshtein。所以我对每个答案都感到惊讶(尤其是@VBoka 的答案)。 :) 【参考方案1】:

这是一个php解决方案:

remove_duplicates("Yanagida Fumit");

function remove_duplicates($full_search_str)         
    // establish connection to your db

    // fetch data
    $query = "          SELECT  `id`, `name` 
                        FROM    `" . $tbl_name . "`
                        WHERE   MATCH (`name`) AGAINST ('" . $full_search_str . "' IN BOOLEAN MODE)
                        AND     `name` <> '" . $full_search_str . "'
             ";

    // run query
    $results = $conn->query($query);

    // loop through results
    foreach($results as $result) 
            // build query
            $query = "  DELETE 
                        FROM    `" . $tbl_name . "`
                        WHERE   `id` = " . $result['id'];

            // run query
            $result = $conn->query($query);
    

【讨论】:

... PHP 不相关。此外,由于不必要的动态 SQL(以及缺少准备好的语句),它具有潜在的危险。哦,它会删除给定名称的所有个实例,这根本不是我们想要的。【参考方案2】:

甲骨文答案:

创建或替换表作者为 选择不同的名称、描述 来自作者;

【讨论】:

....不够;呈现的数据已经不同(尽管这可能会删除一些条目)。 在第一次阅读时,我没有看到您的记录中的数据在单个记录的字段之间错放,以及单个字段的数据不一致,因此您对正确记录之间的正确记录:名字 姓氏 Ha Il Kwan Il Kwan Ha Ha Il-Kwan 这不是 SQL 唯一性问题 - 这是一个数据损坏问题,最好通过控制一开始进入数据的内容来解决。跨度>

以上是关于如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 学习笔记 二

MySQL 学习总结2

如何从左表中仅获取一条记录与右表中的每条记录

SQL 如何复制一条记录的指定字段的内容到另一条记录的指定字段?

PLpgSQL:将每条记录存储在 For Loop 中并返回 json

删除一张表中与另一张表中相同的记录