mysql - 选择相似的记录
问题描述
请考虑以下记录:
- 约翰·多伊
- 戈恩·多伊
- 彼得杏仁
- 安娜·李
- 丹娜·李
- 西蒙·克拉克
- 唐·多伊
我一直试图找出一个 SQL Select 语句,它只检索具有某种相似性的记录(分数待定)。在上面的示例中,预期的查询应返回第 1、2、5、6 和 8 行。我尝试查看MATCH AGAINST
, LEVENSHTEIN
,但这些函数在提供输入的搜索中起作用。就我而言,没有提供任何输入。我想要完成的是检测我的表中的重复记录。
解决方案
您需要进行自联接来比较成对的记录。这是一个小提琴:https ://www.db-fiddle.com/f/ghkCVASHTsw5pfyySEQ9G4/0
SELECT a.name, b.name
FROM tbl a
JOIN tbl b ON a.name > b.name
WHERE compare(a.name, b.name) < threshold
compare(a,b)
是您选择的比较函数。您可以使用字符串之间的Levenshtein 距离。或者你可以使用SOUNDEX(a.name) = SOUNDEX(b.name)
. 或任何其他可以进行您想要的模糊比较的东西。
我的示例中的ON
子句避免了重复比较和自我比较。
推荐阅读
- django - Django 日志配置在本地服务器上工作,但不在远程服务器上
- node.js - 这个问题 TypeError: callback is not a function
- excel - MS Excel:将日期标准化为一种格式
- react-native - 向上滚动 FlatList 反应原生时如何获取更多数据?
- haskell - Monad中的do符号在Haskell中是什么意思
- swiftui - SwiftUI:未应用对齐
- android - leakcanary FirestoreRecyclerAdapter 内存泄漏
- javascript - 如何在 react-native-mapbox-gl 中获取用户位置?
- linux - 审计日志的 Logstash 过滤器模式?
- android - Listview 仅为第一个位置设置文本