Bonjour,
Je butte sur une requête SQL.. je suis un peu rouillé, ça fait longtemps que j'en ai pas fait..
Bref, voila le problème :
Soit une table avec les enregistrement suivants :
code_doc | num_motclef
a 1
a 2
a 3
b 2
b 3
c 3
c 4
c 5
Je voudrais obtenir les documents qui possèdent par exemple le mot clef 2 ET 3.
Cela doit me donner ainsi les documents a et b, avec une seule ligne par document trouvé bien sûr…
J'ai essayé plusieurs variantes de GROUP By et autres joyeusetés, sans succès. Le nombre de mots clefs servant à la section est variable (pas toujours 2, cela peut etre 1 ou 10 … )
Merci d'avance
# Heu, au pif....
Posté par Gyro Gearllose . Évalué à 1.
from table t
where num_motclef in (2,3);
ca doit marcher, mais il y a sûrement plus propre comme code....
[^] # Re: Heu, au pif....
Posté par Dring . Évalué à 1.
Tu va renvoyer tous les docs qui contiennent 2, 3 ou 2 et 3. Or le monsieur ne veut que ceux qui contiennent 2 ET 3.
# Euh...
Posté par Infernal Quack (site web personnel) . Évalué à 3.
select distinct code_doc from MA_TABLE where num_motclef in ...
devrait le faire (de mémoire).
L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire
# Ça a l'air de marcher
Posté par icyfemur . Évalué à 1.
SELECT code_doc
FROM t_selection
WHERE num_motclef =2 OR num_motclef =3
GROUP BY code_doc
HAVING COUNT( code_doc ) =2 LIMIT 0 , 30
Qui a l'air de bien marcher.
[^] # Re: Ça a l'air de marcher
Posté par Gyro Gearllose . Évalué à 2.
Qu'on utilise le OR comme tu le proposes, ou IN comme je le propose (en remplaçant le reste de ma requête par la tienne, bien entendu), le coût en terme de temps d'execution est exactement le même.
Par contre, je ne sais pas ce que ça donnerai avec plusieurs num_motclef (en plus la requête devient plus longue avec des OR)...
Sinon, on peut obtenir le même résultat en utilisant un alias sur le deuxième mot clef, mais là, c'est coûteux en tout (requête deux fois plus lente, et n-mots-clefs fois plus longue).
Voilà, en espérant avoir aidé un peu quand même à faire avancer le schmilblick.
[^] # Re: Ça a l'air de marcher
Posté par Dring . Évalué à 1.
Avant de faire des tests en terme de temps d'exécution, il faudrait savoir :
- quel SGBDR il utilise,
- quelle est sa volumétrie, ses statistiques (nombre de mot clé par document)
- quelles optimisations sont mises en places (index, ...)
[^] # Re: Ça a l'air de marcher
Posté par icyfemur . Évalué à 2.
# Une solution par SGBDR
Posté par Dring . Évalué à 2.
Exemple de solution relativement universelle, mais qui ne marche que si l'association code_doc / num_motclef est unique (situation suggérée par le jeu de test présenté) :
/* Selectionne les documents associés avec les
* mots clés 2 et 3.
*/
SELECT code_doc
FROM matable
WHERE num_motclef IN (2,3)
GROUP BY code_doc
HAVING count(*) = 2
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.