【问题标题】:MySQL show possible duplicatesMySQL 显示可能的重复项
【发布时间】:2011-04-26 07:32:22
【问题描述】:

我希望从列 name 中显示我的 MySQL 表中所有可能的重复条目。

例如,Adobe Photoshop 和 Photoshop 应显示为“可能重复”。

这可能吗?

【问题讨论】:

  • 这不是一个简单的任务。 select substring_index('Mike A.',' ',1) 例如返回 Mike 但是如果你有“B. Mike”会发生什么?恐怕你要考虑的情况很多。
  • SOUNDEX,也许吧?见:stackoverflow.com/questions/4936371/…
  • 你怎么知道 Mike M 是 Mike A 的复制品?
  • 会是“Mike A.”可能是“John A.”的重复项?
  • @AJ 可能不会,我需要某种形式的阈值。我有一个包含 15,000 个条目的大型列表,其中一些是半重复的并且是不必要的(我喜欢干净的数据库)。

标签: mysql sql


【解决方案1】:

您可以从使用SOUNDEX() 开始,这可能会满足您的需要

SOUNDEX() 的缺点是:

  • 无法区分较长的字符串。只考虑前几个字符,最后发散的较长字符串会生成相同的 SOUNDEX 值
  • 第一个字母必须相同,否则您将无法轻松找到匹配项。 SQL Server 有 DIFFERENCE() 函数来告诉你两个 SOUNDEX 值相差多少,但我认为 MySQL 没有内置这种类型。
  • 对于 MySQL,至少根据 the docs,对于 unicode 输入,SOUNDEX 已损坏

例子:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

对于更高级的需求,我认为您需要查看两个字符串的Levenshtein distance(也称为“编辑距离”)并使用阈值。这是更复杂(=更慢)的解决方案,但它允许更大的灵活性。

主要缺点是,您需要两个字符串来计算它们之间的距离。使用 SOUNDEX,您可以将预先计算的 SOUNDEX 存储在您的表中,并对其进行比较/排序/分组/过滤。使用 Levenshtein 距离,您可能会发现“Microsoft”和“Nzcrosoft”之间的差异只有 2,但要得出这个结果还需要更多时间。

无论如何,可以在Levenshtein Distance as a MySQL Stored Function 找到一个用于 MySQL 的 Levenshtein 距离函数示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多