选择查询+连接表

时间:2012-01-28 07:35:40

标签: php mysql

我有一个名为indx_0的表格,其中我选择所有“pid”(产品ID)与“wid”(字ID)的组合,按照与大多数单词匹配的产品对它们进行分组。现在,由于实际单词存储在名为“windex”的不同表中,因此表indx_0仅包含与单词ID匹配的产品ID。

以下是我用来获取结果的当前查询。

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

说我搜索“ddr存储卡”我不会得到包含“ddr3”优先于任何其他关键字的结果,因为它搜索完全匹配。所以“ddr存储卡”和“手机存储卡”将被视为相同,因为“ddr3”和“phone”都不等于ddr。

我想使用join和LIKE(或任何其他更好的方式)来允许“ddr”与“ddr3”或“ddr2”非常接近地匹配,以便在没有紧密匹配的其他结果上优先于它。

以下是表结构:

CREATE TABLE IF NOT EXISTS `windex` (
  `word` varchar(64) NOT NULL,
  `wid` int(10) NOT NULL AUTO_INCREMENT
  PRIMARY KEY (`wid`),
  UNIQUE KEY `word` (`word`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=834922 ;

CREATE TABLE IF NOT EXISTS `indx_0` (
  `wid` int(7) NOT NULL,
  `pid` int(7) NOT NULL,
  UNIQUE KEY `wid` (`wid`,`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

这可能吗?

谢谢你!

1 个答案:

答案 0 :(得分:0)

如果你按字ID过滤,你显然没有得到近距离匹配。每个ID都有一个特定的单词。您想要的是直接从windex查询ID并在indx_0中查找匹配项。

SELECT i0.pid, count(*) WordMatchCount
FROM indx_0 AS i0
LEFT JOIN windex AS wi ON (wi.wid = i0.wid)
WHERE wi.word REGEXP '(.*)ddr(.*)|(.*)memory(.*)|(.*)card(.*)'
group by i0.pid
order by WordMatchCount desc

我确保运行EXPLAIN并索引相应的列。