MySQL查询以在单个列中查找相似值

Posted

技术标签:

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

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

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

- Hurt Locker
- The Hurt Locker

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

更新

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

【问题讨论】:

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

以上是关于MySQL查询以在单个列中查找相似值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 的单个列中删除重复的逗号分隔值

如何在单个字段或列中连接多个值? (MySQL)

MySQL查询用下划线替换列中的空格

如何在同一个表上组合两个查询以在 MySQL 中获得单个结果集

使用单个查询(递归查询)在 mysql 表中查找所有父级

如何编写一个同时适用于 HSQLDB 和 MySQL 的查询以在 WHERE 子句中为日期添加天数?