【问题标题】:Combining two MySQL tables that are loosely connected组合两个松散连接的 MySQL 表
【发布时间】:2015-07-14 08:05:25
【问题描述】:

所以我在数据库中有两个未连接的 MYSQL 表(两个不同的数据源)[每个大约 500,000 行]。他们有公司名称、公司地址、城市、州等信息,以及每一个中的一些具体信息,一旦我弄清楚如何将两者“链接”在一起,我希望用这些信息填充第三个表。

我最初的想法是如果企业名称/城市/地址相同,则尝试将它们链接在一起。

问题是,对于很多行,两个表之间没有完全匹配。因此,在另一个“XYZ Incorporated”中,企业名称可能是“XYZ”,某些地址也是如此,它可能是“123 NW 10th St.”。或“西北第十街 123 号”。

所以现在我正试图找出一种方法来找到一个“足够接近”的匹配,这就是我迷路的地方。以前从来没有做过这样的事情,也不知道从哪里开始。我的想法是我可以设置某种阈值,如果匹配足够接近,我会将两个 ID 插入另一个将两者链接在一起的表中以供将来处理。

(数据库目前为 InnoDB / MySQL)

非常感谢您的帮助!

【问题讨论】:

  • 您是否曾经在查询中使用过LIKE
  • 当然可以,但这行不通……文本不完全匹配,这会导致一大块不工作。因此,如果我要搜索 XYZ Inc,它不会匹配 XYZ。此外,不同城市可能有 10 个 XYZ(或同一城市有多个)。因此,我还必须将它与本地的 LIKE 配对,而且匹配度很低。我更多的是在寻找一种方法来找到多个术语上的紧密匹配,并说找到“90%”匹配的东西。
  • LIKE '%XYZ%' 可能会起作用。它肯定会捕获更多。
  • 这比看起来更复杂。我认为尝试编写可以自动执行此操作的东西将具有极低的投资回报率。老实说,你最好的选择是尽可能地进行匹配,然后取出剩余的行并将它们移植到 Mechanical Turk 之类的东西上,以供人类审查。
  • 无论我期望得到什么损失,只是如果我尝试通过 LIKE 语句运行它,我会损失很多。 infomaniac 下面的答案非常接近我需要的答案。我的想法是对每场比赛进行加权,如果高于某个分数,则将两个匹配的 ID 插入新表中。如果我可以让它工作,即使我需要让它在服务器上运行几天,那也很好,因为它是一次性的。所以如果我能匹配 90+% 那就太好了。

标签: php mysql database innodb normalization


【解决方案1】:

我建议创建一个View 来组合这两个表。为了找出最匹配的字段,我建议使用“Levenshtein”距离,或者像“Jaro/Winkler”这样更智能的距离。前段时间我经历过类似的事情,并在博客上写过。

http://dannykopping.com/blog/fuzzy-text-search-mysql-jaro-winkler

【讨论】:

  • 这看起来非常接近我想要做的,非常感谢!
  • 因为我要通过一百万条记录运行它,你能推荐任何东西来加速它/你将如何修改它以提供基于多列的分数(我可能会加权每个以及)。
  • 您需要持续执行此操作还是一次性执行此操作?
  • 这将是一次性的。我的想法是在企业名称上运行它,然后是地址/城市/州(以及每个重量)。因此,如果企业名称匹配,这是一个很大的指标。然后,由于有很多企业名称相同,但位置不同,因此在此基础上进一步对其进行限定/加权。
  • 这正是我的想法。即使我需要让它运行几天也没关系。您能否就在多个列上运行它的最佳方式提出任何建议?我大概能弄明白,只是想看看你的想法,因为你已经这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多