【问题标题】: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 的答案)。 :)

标签: mysql sql


【解决方案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 唯一性问题 - 这是一个数据损坏问题,最好通过控制一开始进入数据的内容来解决。跨度>
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2012-06-03
  • 2020-06-15
  • 2018-02-17
  • 1970-01-01
相关资源
最近更新 更多