【发布时间】:2015-07-22 09:59:21
【问题描述】:
我需要将数据库中的产品与来自数据馈送的产品进行匹配。
数据馈送有一个产品名称列。
虽然我的数据库表有 KEYWORDS 和 IGNORE_KEYWORDS 列。
匹配应该是这样的,如果 ALL db KEYWORDS 匹配数据馈送产品名称并且 NONE db IGNORE_KEYWORDS 匹配数据馈送产品名称,那么它是肯定的匹配。
例如
Datafeed:
ID, Name, Url, ...
1, iPhone 5s 64GB Unlocked 1 year warranty, http://....
2, iPhone 5s 64GB Locked O2 2 years Deal, http://....
Database:
ID, KEYWORDS, IGNORE_KEYWORDS, ...
1000, iPhone 5s 64GB, Locked, ...
1001, iPhone 5s 64GB, Unlocked, ...
现在当我匹配时,它应该匹配:
Datafeed #1 to Database #1000
Datafeed #2 to Database #1001
问题是使用直接查询很难匹配数据馈送产品名称中数据库列中的所有关键字。我认为这甚至是不可能的!但是可能有一些直接的方法可以做到这一点。
如果不是直接方法,那么是否有间接方法?像创建另一个表来保存数据库原始表的关键字和ID?
进行这种匹配的最快和最优化的方法是什么?
提前致谢!
【问题讨论】:
-
唯一的方法是将关键字移动到单独的表格中,每行一个关键字。然后您就可以对它们执行查询。单个查询是不可能的,但至少它是可能的。
-
感谢您的回复。这里重要的是特定产品的所有关键字都与单个数据馈送产品名称匹配。所以如果例如。
iPhone-1000和5s-1000匹配但64GB-1000不匹配,则表示产品ID1000不匹配。我们该怎么做? -
我猜这种匹配需要一个不同的检查和一个count(*)测试来验证产品的所有关键字都匹配???有什么简单的方法吗?
-
SELECT COUNT(*) FROM my_keywords WHERE value IN ('iPhone-1000', '5s-1000', ' 64GB-1000')然后你会检查计数是否为 3。 -
我想应该是这样的:
SELECT count(*), id FROM my_keywords WHERE keyword IN ('iPhone', '5s', '64GB') GROUP BY id。所以这将返回所有带有计数的产品 id,我们选择那些匹配所有 3 的产品,对吗?我想如果我们的关键字和搜索词确保是唯一的,这将起作用。