请考虑以下是我的两个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 | +-------+-------------------------+ +-------+------------------------------+
我很难智能地比较两个不同表中的数据。我在搜索或比较的背景下挖了很多,我找到了
...在PHP和MySQL中,但它们都没有效率。因为similar_text
和LEVENSHTEIN
非常好,但最糟糕的缺点是1000行非常慢,soundex()
和metaphones
会为这些项目返回相同的声音不一样,像“iphone”和“ipad”,两者都不一样等等。我想做的就是有效地比较两行,就像上面的例子“iPhone 4S 16GB”和“iPhone4S 16GB”是相同的或者如上所述,我的解决方案应该能够快速地比较这些行。请告诉我有什么比较选择,以便我可以解决我的疑问。我真的很感激任何想法,任何提示。
注意:我的一个表包含约900行。
这是以下内容的延续:
答案 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解析字段中搜索)。更快;)
要提高准确性,您可能需要删除所有常用字词并删除标点符号,例如:
然后将所有多个空格(例如5个空格)合并到一个空格中。
你正在做的事情的性质将有数百个小调整,你可以做到完善它,满足你的需要。
答案 3 :(得分:0)
从mysql的角度来看,解决方案是:
SELECT *
FROM tb1
WHERE (USD, Model) NOT IN (SELECT USD, Model FROM tb2)