2012-01-28 2 views
0

J'ai une table appelée indx_0 où je sélectionne toutes les combinaisons "pid" (id produit) avec "wid" (mot id) en les regroupant par produits qui correspondent au plus grand nombre de mots. Maintenant, puisque les mots réels sont stockés dans une table différente appelée "windex", la table indx_0 ne contient que l'ID de produit correspondant à l'ID du mot.select query + joindre des tables

Voici la requête courante que j'utilise pour obtenir les résultats.

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

recherche Indiquez I pour « carte mémoire ddr » Je ne vais pas obtenir le résultat qui contient « ddr3 » priorité sur tout autre mot-clé car il recherche de correspondance exacte. donc "carte mémoire ddr" et "carte mémoire téléphone" seraient traités comme égaux puisque ni "ddr3" ni "téléphone" ne sont égaux à ddr. Je veux utiliser join et LIKE (ou tout autre moyen préférable) pour permettre à "ddr" de correspondre très étroitement à "ddr3" ou "ddr2" pour le prioriser sur d'autres résultats où il n'y a pas de correspondance.

Voici les structures tableau:

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; 

Est-ce possible?

merci!

+1

s'il vous plaît structure de la table menthion correctement – diEcho

+0

ajouté la structure des tables – nick

+0

est là aucune clé primaire dans 'indx_o' aussi me dire quelle est la table parent et qui est table enfant .. signifie en termes de« clé étrangère ». – diEcho

Répondre

0

Si vous filtrez par ID de mot, il est évident que vous n'obtenez pas de correspondance proche. Chaque ID a un mot spécifique. Ce que vous voulez est d'interroger les ID directement à partir de et de rechercher les correspondances dans 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 

J'assurerai courir EXPLAIN et indexer les colonnes appropriées, cependant.