2

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

表 1                                                                       表 2

+--------+-------------+ +--------+------ ------------------------------------+
| 美元 | 型号 | | 美元 | 型号 |
+--------+-------------+ +--------+------ ------------------------------------+
| 700 | iPad 2 WiFi 16GB | | 710 | iPad2 WiFi 16GB |
| 400 | iPhone 4S 16GB | | 450 | iPhone4S 16GB |
| 250 | iPod Touch(第 4 代)8GB | | 200 | iPod Touch 第 4 代 8GB |
+--------+-------------+ +--------+------ ------------------------------------+

我被困在智能地比较两个不同表中的数据。我在搜索或比较的上下文中挖掘了很多,我发现

  • 相似文本()
  • 声音()
  • 变音器()
  • 莱文斯坦()
  • 喜欢
  • 全文
  • 正则表达式

...在 PHP 和 MySQL 中,但它们都没有效率。因为similar_textLEVENSHTEIN真的很好,但最糟糕的缺点是它们对于 1000 行非常慢,soundex()并且metaphones对于不相似的项目返回相同的声音,比如“iphone”和“ipad”,两者都不相同等等。所有我想要做的是有效地比较与上述示例“iPhone 4S 16GB”和“iPhone4S 16GB”相同或类似的两行,我的解决方案应该可以快速比较这些行。请让我知道我有哪些比较选项,以便我解决我的查询。我真的很感激任何想法,任何提示。

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

这是以下内容的延续:

比较两个数组并排序 WRT USD

两个表列之间与mysql的模式比较

4

4 回答 4

2

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

这至少可以解决您所说的“相似性”示例。

于 2012-11-18T16:15:23.397 回答
1

我在做垃圾邮件检测器时涉及到这种事情(大量研究,后来放弃了这个想法,但继续前进......)。

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

LIKE '%hello' 不能使用索引,但是,LIKE 'hello%' 可以。此外,大字段将导致大索引以按照您的意图进行工作(它们适用于通常较短的电子邮件地址)。

使用 = 这也将不区分大小写,您必须为此使用它。

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

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

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

  • 和 = 已删除
  • , = 已删除
  • ' = 已删除
  • 有 = 已删除
  • it's = its or it is (取决于你喜欢哪个)

然后将所有多个空格(例如 5 个空格)组合成 1 个空格。

您正在做的事情的性质将有数百个小调整,您可以根据需要对其进行完善。

于 2012-11-18T17:20:51.990 回答
1

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

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

该解决方案高度依赖于“strip_unnecessary()”函数的好坏以及您对“模型”字段内容的了解程度。

于 2012-11-18T16:21:34.070 回答
0

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

SELECT *
FROM tb1
WHERE (USD, Model) NOT IN (SELECT USD, Model FROM tb2)
于 2012-11-18T16:26:39.720 回答