复杂的mysql select语句

时间:2012-01-28 03:07:36

标签: php mysql

我正在尝试为包含产品的网站制作迷你搜索引擎。我已经考虑过全文搜索,LIKE条款等等,但我仍然想继续我的方式,因为数据库将变得非常庞大(数以亿计的产品)。

设计就像这样 - 我有一个表格将单词与单词ID配对。我有另一个表,其中包含产品匹配的产品ID的所有字对ID。当用户搜索“2gb存储卡”时,脚本会解析“2gb”“memory”和“card”。

然后我用:

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个产品匹配其中2个单词的组合。

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

1 个答案:

答案 0 :(得分: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