2012-01-28 2 views
0

У меня есть таблица indx_0, где я выбираю все «pid» (идентификатор продукта) с «wid» (word id), группируя их по продуктам, которые соответствуют большинству слов. Теперь, поскольку фактические слова хранятся в другой таблице, называемой «windex», таблица indx_0 содержит только идентификатор продукта, соответствующий идентификатору слова.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 

Say I поиск «Карта памяти 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

пожалуйста menthion таблица структура должным образом – diEcho

+0

добавлена ​​структура таблиц – nick

+0

нет никакого первичного ключа в 'indx_o' также сказать мне, что является родительской таблицей, а которая является дочерней таблицей..means в терминах' foreign key'. – diEcho

ответ

0

Если вы фильтруете по слову 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 и указательный соответствующие столбцы, хотя.