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

Requêtes MySQL Discussion :

Requête avec plusieurs jointures


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 36
    Points
    36
    Par défaut Requête avec plusieurs jointures
    Bonjour,

    J'ai 3 tables qui sont candidats, professions et langues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE candidats (
      id INT,
      nom VARCHAR(100)
    );
     
    CREATE TABLE professions (
      candidat_id INT,
      profession_id INT
    );
     
    CREATE TABLE langues (
      candidat_id INT,
      langue_id INT
    );
    Les valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    INSERT INTO candidats (id, nom) VALUES 
    (1, "MARTIN"),
    (2, "DURAND"),
    (3, "DUPONT");
     
    INSERT INTO professions (candidat_id, profession_id) VALUES
    (1, 1),
    (1, 3),
    (2, 1),
    (2, 2),
    (3, 3),
    (3, 1);
     
    INSERT INTO langues (candidat_id, langue_id) VALUES
    (1, 2),
    (1, 4),
    (2, 1),
    (2, 4),
    (3, 2),
    (3, 3);
    Maintenant les requêtes que je souhaite exécutées
    1) Tous les candidats dont la profession est 1 et 3

    Celle là, j'ai réussi de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id
    FROM candidats JOIN professions ON id = candidat_id  
    WHERE profession_id = 1 OR profession_id = 3 
    GROUP BY id 
    HAVING count(*) = 2
    J'obtiens les candidats 1 et 3.

    2) Maintenant la requête que je n'arrive pas à faire: Tous les candidats dont la profession est 1 et 3 et dont la langue est 2 et 4.

    Ici je devrais obtenir le candidat 1. Mais je n'ai pas réussi

    Si quelqu'un a une idée, je suis preneur.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    C'est, à peu près le même principe.
    Tu fais ta deuxième jointure, tu mets tes nouvelles conditions de filtre afférentes aux langues dans la clause WHERE.
    C'est au niveau de la clause HAVING qu'il va te falloir ruser, il faut décompter non plus les lignes COUNT(*) mais les langues et les professions distinctes par id
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HAVING COUNT(DISTINCT langue_id)=2 
    AND COUNT(DISTINCT profession_id)=2
    en préfixant les noms de colonnes des alias de table, éventuellement, s'il y a risque d'ambigüité.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Merci, ça marche impeccable.

    Effectivement, c'était la ruse dans la clause HAVING qu'il me manquait.

    Pour ceux que ça intéresse, la requête finale est donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id
    FROM candidats 
        JOIN professions p ON id = p.candidat_id  
        JOIN langues l ON id = l.candidat_id
    WHERE (profession_id = 1 OR profession_id = 3) 
    AND (langue_id = 2 OR langue_id = 4) 
    GROUP BY id 
    HAVING count(DISTINCT profession_id) = 2 
    AND count(DISTINCT langue_id) = 2

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

Discussions similaires

  1. Problème requête sql avec plusieurs jointures
    Par CocoX02 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/02/2015, 14h33
  2. Requête avec plusieurs jointures
    Par Vercetti dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/06/2012, 14h30
  3. Requête avec plusieurs jointures.
    Par leom4t dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/03/2011, 18h51
  4. Requête avec auto jointure récalcitrante
    Par vmolines dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 22h31
  5. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 18h55

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