Forum Programmation.autre Requete SQL

Posté par  .
Étiquettes : aucune
0
4
juil.
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

  • # Heu, au pif....

    Posté par  . É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....
    • [^] # Re: Heu, au pif....

      Posté par  . É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.
  • # Euh...

    Posté par  (site web personnel) . É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).

    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  . É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.
    • [^] # Re: Ça a l'air de marcher

      Posté par  . É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.
      • [^] # Re: Ça a l'air de marcher

        Posté par  . É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, ...)
        • [^] # Re: Ça a l'air de marcher

          Posté par  . É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.
  • # Une solution par SGBDR

    Posté par  . É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

Suivre le flux des commentaires

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