Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Retourner aux forums || Retourner au forum Programmation.autre

Programmation.autre : Requete SQL

Posté par Bouil (Jabber id, page perso, ) le 04 juillet 2004
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

--
« La clé d'une langue commune, perdue dans la Tour de Babel, peut être seulement construite par l'usage de l'Espéranto. » Jules Verne.
> Lire le message (8 commentaires, moyenne: 1,6).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Heu, au pif....

Posté par Gyro Gearllose () le 04/07/2004 à 13:32. (lien). Évalué à 1.

select distinct t.cod_doc
from table t
where num_motclef in (2,3);

ca doit marcher, mais il y a sûrement plus propre comme code....

--
All articles which are excluded shall be deemed included
Tous les articles exclus sont considérés inclus
--Brian de Palma in Phantom of the Paradize
  • [^]Re: Heu, au pif....

    Posté par Dring FirebirdVsMySql () le 05/07/2004 à 07:00. (lien). Évalué à 1.

    Ca doit pas vraiment marcher.

    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.

    --
    Non, rien.

Euh...

Posté par Infernal Quack (Jabber id, page perso, ) le 04/07/2004 à 13:32. (lien). Évalué à 3.

Je connais pas le SGBD que tu utilises mais un
select distinct code_doc from MA_TABLE where num_motclef in ...
devrait le faire (de mémoire).

Ça a l'air de marcher

Posté par Bouil (Jabber id, page perso, ) le 04/07/2004 à 14:03. (lien). Évalué à 1.

Bon, apres un peu de reflexion sur IRC, on est arrivé à ça :

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.

--
« La clé d'une langue commune, perdue dans la Tour de Babel, peut être seulement construite par l'usage de l'Espéranto. » Jules Verne.
  • [^]Re: Ça a l'air de marcher

    Posté par Gyro Gearllose () le 04/07/2004 à 14:32. (lien). Évalué à 2.

    Ma solution proposée ci-dessus ne fonctionne évidement pas, j'ai posté trop vite. J'ai fait quelques essais avec une tabe dans une base postgres, et j'ai obtenu quelques résultats intéressants.
    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.

    --
    All articles which are excluded shall be deemed included
    Tous les articles exclus sont considérés inclus
    --Brian de Palma in Phantom of the Paradize
    • [^]Re: Ça a l'air de marcher

      Posté par Dring FirebirdVsMySql () le 05/07/2004 à 07:12. (lien). Évalué à 1.

      Arf, j'ai posté ma réponse beaucoup trop tard !

      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, ...)

      --
      Non, rien.
      • [^]Re: Ça a l'air de marcher

        Posté par Bouil (Jabber id, page perso, ) le 05/07/2004 à 08:41. (lien). Évalué à 2.

        Le SGBD utilisé est MySQL... et la solution postée ci dessus, qui soit dit en passant est la meme que celle que j'ai mis ci dessus, marche très.

        --
        « La clé d'une langue commune, perdue dans la Tour de Babel, peut être seulement construite par l'usage de l'Espéranto. » Jules Verne.

Une solution par SGBDR

Posté par Dring FirebirdVsMySql () le 05/07/2004 à 07:08. (lien). Évalué à 2.

Comme souvent en base de données, la meilleure solution va dépendre du SGBDR utilisé, et des commandes qu'il supporte.

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

--
Non, rien.

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.autre