2012-01-28 112 views
0

我试图为包含产品的网站制作迷你搜索引擎。我已经考虑全文搜索,LIKE子句等,但我仍然想继续我的方式,因为数据库将会非常巨大(数以亿计的产品)。复杂的mysql选择语句

设计是这样的 - 我有一个表单词配对单词ID。我有另一个表,其中包含产品匹配的产品ID的所有字对ID。当用户搜索例如“2GB存储卡”时,该脚本解析“2GB”,“存储器”和“卡”。

然后我用:

SELECT pid 
    FROM indx_0 
WHERE wid = 294 OR wid = 20591 OR wid = 330 

我结束了对配套产品的话。

我有一个PHP算法,以决定哪些产品取决于多个事情去顶部。但是当我将380k结果加载到php数组中时,执行时间变得非常慢。很清楚,我不能那样做。但如果我限制每个单词1000个结果,执行速度很快 - 但它不包括所有可能的结果。

在“indx_0”表中,每个“pid”(产品ID)对于“wid”(单词id)是唯一的。显然,有些产品将会有超过1个匹配。我想检索那些与“wid”有最多匹配的“pid”。

假设有2000个产品匹配“2GB”和200,000个匹配“卡片”和50,000个匹配的“内存”,但只有20个匹配所有这3个字词的产品,以及200个匹配这些字词组合的产品。

是否有可能检索这20个产品以及部分匹配的200个产品?

回答

2

您可能需要做的是按产品ID进行分组,并获得匹配的计数。然后按最大计数命令降序排列......即:一个产品匹配所有3个wID和其他正好匹配1,该3个计数将首先在列表中

SELECT pid, count(*) WordMatchCount 
    FROM indx_0 
    WHERE pid in (294, 20591, 330) 
    group by pid 
    order by WordMatchCount desc 
    limit 1000 
+0

哇非常感谢你!只有一件事我需要改变..“WHERE pid in”实际上是“WHERE wid in”。除此之外它就像我想要的那样工作。 – nick 2012-01-28 07:18:37