2012-09-25 25 views
1

我有一个公司提供给我的目录,他们希望在MySQL数据库中存储和更新。对于每个公司记录没有唯一的标识符,如公司#1234。MySQL查询可以帮助找到类似的客户记录吗?

这些字段通常用于邮寄名单,联系人姓名,公司名称,街道地址,城市,州,邮政编码,电话号码和公司类型。更新将作为CSV文件发送给我,同样没有公司唯一的标识号。

我该如何将db中存储的记录与新的匹配起来,以便更新它?在这个行业中,联系人名称可以更改,甚至可以更改公司名称,因为他们可以添加和减少合作伙伴。他们的街道地址可能会发生变化,因为他们搬家时甚至可以更改电话号码。大多数公司都有一个网站网址,所以希望这不会经常改变,但很容易。

我在MySQL中看到有一个类似的匹配%,这是匹配记录与新信息的答案吗?

我在PHP中工作,如果有PHP解决方案的话。先谢谢那位帮助我解决这个问题的善良的灵魂!

+1

为什么不在mysql中添加另一个字段作为您自己使用的唯一标识。这样你可以稍后识别它们。 – Peon

+1

谢谢你的回复,Dainis。我打算这样做,但如果我不知道要匹配哪个字段以确定它是同一家公司,我如何才能将更新后的记录与该唯一ID进行匹配? – Edward

+0

创建一个差异表,您可以在其中保存日志,如'original_id,old_company_name,new_company_name'等 – Peon

回答

2

没有主键,它总是很棘手。

单线解决方案,决定最适合您需求的规则。

如果我是你,我首先会去找客户来确定一些识别类似记录的规则。由于总是有重复输入或更新错误记录的机会,因此无需主键即可执行此步骤。

规则可能是简单的像:

1. Available fileds: 
    contact name, 
    company name, 
    street address, 
    city, 
    state, 
    zip code, 
    phone number and 
    type of company (I Hope this is industry) 
2. We will first match company name for similarity like 
    select * from table_name where company_name like '%$company_name%' 
3. For all found records, match zip code and phone number. If match, break, record needs to be updated 
4. If not match found in step 3, match street address. If match, break, record needs to be updated 
5. & so on. 

您的客户端是决定这些规则,因为他是该产品的拥有者的最佳人选。

另一方面,从客户端询问规则也很重要,以确保在没有主键的情况下保护您的安全,即使在所有的关注之后,总会有重复记录和/或更新错误记录的机会。你可以尽量减少有良好规则的机会。

0

这是一个相当普遍的问题,但解决方案本身在项目之间有点独特。

我会遍历它们更改时(或创建日期或更新时间戳左右)所排序的所有记录。接下来,我会匹配与主要字段类似的所有条目:公司名称,地址(尽管可能有风险),电话或网址(仅解析域)。然后,我会递归遍历所有找到的条目,直到找不到更多结果。

这个算法可以帮助您找到相同的条目,只要它们一次不会更改所有主要列。如果他们这样做,就没有办法说它是编程的同一家公司。

2001/01/01 Awesome firm, awesome.com 
2002/02/02 Awesome firm, newaddress.com // linked with the first row over company name 
2010/12/05 Ohsome inc, newaddress.com // linked over url 
0

我在前面的SQL Server的一个项目来acroos位类似的情景:

这将貌似现在连接(排例如在1和3)

实例链接行。我曾经做过以下事情来处理它。

1.Usually会有2种files--

一)全喂入(频率每周),这将都从供应商数据库 B)增量进给(频率日报)这会对公司的(插入-I,更新-U作为增量馈送中的标志)

2.因此,一旦我收到完整馈送,我将刷新我的数据库表在一周内喂食一次。此外,我还会在每个公司记录中添加我的内部ID(这些ID是用于内部目的的)

3.在日常基础上,我根据标志(I插入,U更新)处理增量馈送。

4.这里一个非常重要的事情是管理映射表。一旦feed刚刚给它分配一个新的内部id。

5。为了比较数据以避免重复,我使用Fuzzy算法来获得所有可能的匹配,然后使用通配符来筛选和识别哪些是新的和重复的。

0

看看Damerau-Levenshtein距离算法。它计算两个字符串之间的“距离”,并确定将一个字符串转换为另一个字符串需要多少步。两个琴弦越接近越少。

This文章显示了作为MySQL存储函数实现的算法。 Here's的PHP版本。

该算法比LIKE或SOUNDEX好得多。

1

正如你所说的,表中的所有字段都可以改变,那么我认为没有简单的方法可以在你选择的算法中正确地更新表。
实现此目的的方法之一可能是要求人员/系统(向您发送更新的记录)还包含csv文件中更新字段的旧值。如果您有旧值,您可以轻松地将它们与当前记录进行匹配,并使用新值进行更新。

+0

如果没有主键,则不存在将现有记录与更新记录进行匹配的简单方法。 – Edward

+0

@Edward这就是为什么我提到 - “还包括csv文件中更新字段的旧值”。即如果您获得更新记录 - “A,B,K,D”以及“C已更改为K”的信息比您可以轻松地将现有记录“A,B,C,D”更新为“A” B,K,d”。 – Luftwaffe