【问题标题】:MySQL query to find similar values in a single columnMySQL查询以在单个列中查找相似值
【发布时间】:2013-02-12 20:58:13
【问题描述】:

我有高度相似但不准确的重复条目。以下是一些示例:

- 2016: Obama's America
- 2016: Obama's America (VF)

- Hurt Locker
- The Hurt Locker

我可以使用什么查询来获得可能相似的titles

更新

请注意,我并不是要删除 EXACT 重复项。我只是想在单个列中选择相似的值。

【问题讨论】:

  • 好问题!也许有soundex的东西?
  • @ArnoldDaniels 好主意,感谢您的参考。
  • 我认为这是问题的一半。如果定义“相似”很容易,那么这个问题几乎不值得问。

标签: mysql sql similarity


【解决方案1】:

我认为这可以通过使用一些string metric 测量字符串之间的距离来解决。

Levenshtein 似乎是最著名的指标,我在 Oracle 中使用了它的一些实现。也是implemented for MySQL。您可能会发现其他一些更适合您的指标。

【讨论】:

    【解决方案2】:

    不确定这是最好的方法还是最有效的方法,这肯定取决于相似的含义。如果意思是标题包含一行中的所有文本但另一行中包含一些文本,那么这样的事情应该有效:

    SELECT DISTINCT T.Title
    FROM YourTable T
       LEFT JOIN YourTable T2 ON T.Title != T2.Title
    WHERE T.Title LIKE CONCAT('%', T2.Title, '%')
    UNION 
    SELECT DISTINCT T2.Title
    FROM YourTable T
       LEFT JOIN YourTable T2 ON T.Title != T2.Title
    WHERE T.Title LIKE CONCAT('%', T2.Title, '%')
    ORDER BY Title
    

    这里是SQL Fiddle

    【讨论】:

    • 我认为这行不通。电影America 将匹配所有包含美国的电影。
    • @ArnoldDaniels -- 是的,就像我说的,类似是非常模糊的 :) 有趣的问题。我想问你——美国应该匹配什么?只有像美国一号这样的电影,但不是美国大帝:) 祝你好运。
    • @ArnoldDaniels -- 一种选择是添加最大长度差 -- 这是一个快速的小提琴:sqlfiddle.com/#!2/17173/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多