IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Jointure, avoir un équivalent de IN en ET


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 30
    Points : 23
    Points
    23
    Par défaut Jointure, avoir un équivalent de IN en ET
    Bonjour,
    désolé pour le titre peu explicite je n'avais pas plus d'idées.

    je rencontre actuellement un problème de requête sql.

    Dans un premier temps je donne un exemple simplifié de ma requête, puis j'expose mon problème :

    J'ai trois tables : A tag et tagA
    où "A" est une liste d'item,
    où "tag" es tune liste de tags
    et où "tagA" relie "A" à un ou plusieurs "tag"

    la requete (simplifiée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     SELECT count(A.id) FROM A
         JOIN tagA ON tagA.id_A=A.id
         JOIN tag ON tag.id=tagA.id_tag
     WHERE 
         tag IN (1,5,12,17,...etc)
    Donc comme vous pouvez le voir on sélectionne A, on fait une jointure sur les tag.
    Au finale on cherche tous les A qui ont le tag 1 OU 5 OU 12 OU 17 OU ....

    Mon problème c'est que je voudrais sélection les A qui ont a la fois le tag 1 ET 5 ET 12 ET 17 ET ....

    Mais je ne sais absolument pas comment procéder.

    En vous remerciant d'avance pour toute aide apportée.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Pour ce genre de cas il faut passer par un group by + having.

    Requête générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select ma_col
    from ma_table
    where ma_cond in (1, 2, 3)
    group by ma_col
    having count(*) = 3
    Si vous avez des doublons passez par count(distinct..)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Réponse rapide et efficace, merci.

    Au cas où quelqu'un passe par là, je donne l'équivalent avec ma jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT count(distinct tag.id) as cpt FROM A
         JOIN tagA ON tagA.id_A=A.id
         JOIN tag ON tag.id=tagA.id_tag
     WHERE 
         tag IN (1,5,12,17)
     GROUP BY A.id
     HAVING cpt=4

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/03/2013, 16h14
  2. [AC-2007] Recherche équivalent Left Join avec jointure =
    Par neupont dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/10/2012, 19h58
  3. [AC-2007] jointure pour avoir toutes les lignes des 2 tables
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/12/2009, 22h19
  4. jointure , comment avoir les resultats sans correspondance
    Par venomelektro dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/05/2008, 16h20
  5. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo