如何智能地比较两个表?

时间:2012-11-18 16:05:34

标签: php mysql

请考虑以下是我的两个sql表:

表1 表2

+-------+-------------------------+   +-------+------------------------------+
| USD   | Model                   |   | USD   | Model                        |
+-------+-------------------------+   +-------+------------------------------+
| 700   | iPad 2 WiFi 16GB        |   | 710   | iPad2 WiFi 16GB              |
| 400   | iPhone 4S 16GB          |   | 450   | iPhone4S 16GB                |
| 250   | iPod Touch(4th Gen)8GB  |   | 200   |iPod Touch 4th Generation 8GB |
+-------+-------------------------+   +-------+------------------------------+

我很难智能地比较两个不同表中的数据。我在搜索或比较的背景下挖了很多,我找到了

  • similar_text()
  • 同音()
  • 变音()
  • 的Levenshtein()
  • 全文
  • 正则表达式

...在PHP和MySQL中,但它们都没有效率。因为similar_textLEVENSHTEIN非常好,但最糟糕的缺点是1000行非常慢,soundex()metaphones会为这些项目返回相同的声音不一样,像“iphone”和“ipad”,两者都不一样等等。我想做的就是有效地比较两行,就像上面的例子“iPhone 4S 16GB”和“iPhone4S 16GB”是相同的或者如上所述,我的解决方案应该能够快速地比较这些行。请告诉我有什么比较选择,以便我可以解决我的疑问。我真的很感激任何想法,任何提示。

注意:我的一个表包含约900行。

这是以下内容的延续:

Compare two arrays and sort WRT USD

Pattern comparing with mysql between two tables column

4 个答案:

答案 0 :(得分:2)

如果您不喜欢复杂但更有可能产生良好结果的解决方案,那么您可能只想从文本字符串中删除空格并尝试简单的字符串比较..或者可能转换到所有UPPER然后比较没有空格。

至少可以解决你所陈述的“相似性”的例子。

答案 1 :(得分:1)

一种方法是创建一个函数/存储过程,它删除一串空格'(',')',用'Gen'替换'Generation',依此类推。之后,您可以创建两个与当前表相同的临时表,除了应用“strip_unnecessary()”函数的“Model”字段。现在它应该只是一个JOIN问题:将表格放在一起或以任何其他方式比较它们。

临时表的技巧可以节省一些执行时间,但如果您要经常执行此查询,请考虑使用视图来提高性能。

此解决方案高度依赖于'strip_unnecessary()'功能的好坏以及您在“模型”字段的内容之前知道多少。

答案 2 :(得分:1)

我在做垃圾邮件检测器时已经讨论了这种事情(大量的研究,然后放弃了这个想法,但继续......)。

基本上,不要使用like,它在大文本上很慢,索引有限,例如:

LIKE'%hello'不能使用索引,但是,LIKE'hello%'可以。此外,大字段将导致大型索引使您按预期工作(他们可以说电子邮件地址往往很短)。

使用=也是不区分大小写的,你必须拥有它。

接下来,向表中添加一个新字段,其中包含已经解析的metaphone()表示(这意味着它只需要计算ONCE)。

现在你有一张1000条记录的表,每条记录都有他们的metaphone版本以及原始版本。您必须这样做才能获得所需的效率。当您想要查看某些文本是否已存在时,您只需将新文本转换为它的metephone版本,然后在db表中搜索它(在metephone解析字段中搜索)。更快;)

要提高准确性,您可能需要删除所有常用字词并删除标点符号,例如:

  • 和=已删除
  • ,=已删除
  • '=已删除
  • has = deleted
  • 它是=它或它(取决于你喜欢的)

然后将所有多个空格(例如5个空格)合并到一个空格中。

你正在做的事情的性质将有数百个小调整,你可以做到完善它,满足你的需要。

答案 3 :(得分:0)

从mysql的角度来看,解决方案是:

SELECT *
FROM tb1
WHERE (USD, Model) NOT IN (SELECT USD, Model FROM tb2)