{MySQL} récupérer un id en fonction de plusieurs e

orion999 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention   -  
 fiu -
Bonjour,

J'ai un script qui annalyse des pages et stocke divers mot clé dans une base de données avec l'id de la page en correspondance.

CREATE TABLE `documents_keywords` (
  `id` int(11) unsigned NOT NULL,
  `keyword` varchar(128) NOT NULL,
  KEY `id` (`id`,`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Tant que l'on y est un petit jeu d'essai :

INSERT INTO `documents_keywords` (`id`, `keyword`) VALUES
(1, 'velo'),
(1, 'sport'),
(1, 'terre'),
(2, 'quad'),
(2, 'terre'),
(2, 'loisir'),
(3, 'loisir'),
(3, 'cinema'),
(3, 'ville');


A présent j'aimerai faire une requête de recherche qui, lorsque j'ai le mot clé terre par exemple me sorte l'id 1 et 2 (sa je sais le faire :p ). La ou j'y arrive moins c'est lorsque j'ai le mot clé terre et velo par exemple... fatalement je ne peu pas utiliser de AND dans ma requête car je n'ai qu'un seul mot clé par entrée...

J'ai été regarder GROUP BY mais a première vue ce n'est pas tellement ce que je cherche...

Si quelqu'un à une piste je suis preneur :p
Cordialement.
A voir également:

1 réponse

fiu
 
salut

si tu veux lister les id correspondant à tous les n mot-clefs tu peux utiliser
select distinct t1.id
from documents_keywords t1, documents_keywords t2
-- , documents_keywords t3 etc
where t1.id = t2.id -- and t2.id = t3.id etc
and t1.keyword in ('terre', 'velo' /* , 'jardin' , etc*/)
and t2.keyword in ('terre', 'velo'
/* , 'jardin' , etc*/)
-- and t3.keyword in ('terre', 'velo' /* , 'jardin' , etc*/) and etc
and t1.keyword < t2.keyword
-- and t2.keyword < t3.keyword and etc

ca revient à écrire pour chaque id les x combinaisons de n keyword en prenant soin de les écrire dans l'ordre alphabétique ; les id pour lesquels on n'a pas n keywords ne pourront être conservés (il y aura au moins une table Tn pour laquelle on ne trouvera pas un keyword "plus grand" que son prédécesseur) ; des id pour lesquels on a plus d'une combinaison, on n'en conservera qu'un grâce au distinct
0