2012-01-28 12 views
0

私はすべての "pid"(製品ID)cominationsを "wid"(単語ID)と選択して、最も多くの単語に一致する製品をグループ化するindx_0というテーブルを持っています。現在、実際の単語は「windex」という別のテーブルに格納されているため、テーブルindx_0にはその単語のIDと一致するプロダクトIDのみが含まれています。select query + join tables

ここに結果を得るために使用する現在のクエリがあります。

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

は、私は私はそれが完全一致を検索するので、他のキーワードよりも優先「DDR3」を含む結果を得ることはありません「DDRメモリカード」を検索言います。 "ddr3"と "phone"のどちらもddrと等しくないので、 "ddr memory card"と "phone memory card"は等しく扱われます。

"ddr3"や "ddr2"と "ddr3"または "ddr2"を非常によく一致させるために、joinやLIKE(あるいは他の好きな方法)を使用して、近くに一致しない他の結果よりも優先させたい。

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

menthionテーブル構造を正しく指定してください – diEcho

+0

テーブルの構造を追加しました – nick

+0

'indx_o'にはプライマリキーがありません。どちらが親テーブルで、どのテーブルが子テーブルであるかを教えてください。 – diEcho

答えて

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とインデックスの適切な列を実行するようにしてくださいと思います。