如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?
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 唯一性问题 - 这是一个数据损坏问题,最好通过控制一开始进入数据的内容来解决。跨度>以上是关于如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?的主要内容,如果未能解决你的问题,请参考以下文章
SQL 如何复制一条记录的指定字段的内容到另一条记录的指定字段?