2012-01-28 202 views
0

我有一個名爲indx_0的表,其中我使用「wid」(單詞id)將所有「pid」(產品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

請正確結合表結構的表結構 – diEcho 2012-01-28 07:43:47

+0

表的結構增加 – nick 2012-01-28 23:38:26

+0

是否在'indx_o'中沒有主鍵還告訴我哪個是父表,哪個是子表......用'外鍵'表示。 – diEcho 2012-01-29 09:50:38

回答

0

如果您是通過單詞ID進行過濾,那麼您顯然不會接近匹配。每個ID都有一個特定的詞。您想要直接從查詢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並索引相應的列。