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 :

SELECT dans un autre SELECT avec un LEFT JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 24
    Points
    24
    Par défaut SELECT dans un autre SELECT avec un LEFT JOIN
    Bonsoir à tous

    Voila j'ai un SELECT avec une clause WHERE inclus dans un autre SELECT qui me retourne bien ce que je veux pour numIndex.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SELECT table1.colonneX, (SELECT table2.colonneY FROM table2 WHERE table2.colonneZ = xx) AS numIndex FROM table1
    Le problème c'est que numIndex référence un id d'un enregistrement dans une autre table et je voudrai faire une jointure sur cette table, ou mettre la jointure ?

    Merci pour votre aide, je galère depuis pas mal de temps dans ma requête

    ++
    Oldchap

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Désolé pour le mauvais endroit ou ma question a été posée.
    J'ai fini par trouvé la solution à mon problème, j'ai intégré le deuxième SELECT dans la clause LEFT JOIN et non dans le premier SELECT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT table1.colonneX, table3.coloneX FROM table1 
    LEFT JOIN table3 ON table3.colonneY = (SELECT table2.colonneY FROM table2 WHERE table2.colonneZ = xx)
    Oldchap

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut Oldchap.

    Si tu veux faire une jointure entre deux tables, il faut entre autre une clef étrangère entre ces deux tables.
    Or dans ton exemple, il n'y a pas de relation entre la table1 et la table 3.

    Partons de ta restriction entre table3 et table2. Avec des jointures, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
    from            table3 as t3
     
    left outer join table2 as t2
    on  t2.colonneY = t3.colonneY
    and t2.colonneZ = xx;
    Et comment faire la relation entre table1 et table3 ? Dans ton exemple, il manque une jointure.
    Si tu procèdes de la même façon, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select *
     
    from            table1 as t1
     
    left outer join table3 as t3
    on  t3.colonneX = t1.colonneX
     
    left outer join table2 as t2
    on  t2.colonneY = t3.colonneY
    and t2.colonneZ = xx;
    ColonneX est la jointure entre la table1 et la table3
    ColonneY est la jointure entre la table3 et la table2.

    Si tu mets "left outer join", c'est faire en sorte de toujours obtenir la ligne en provenance de la table de gauche (left).
    Par contre, si la jointure ne se fait pas, tu auras que des NULL dans la ligne de la table3, et idem dans la table2.

    Si tu ne veux pas la ligne de la table1 et de surcroît dans la table3, il faut mettre un "inner join".

    Si tu n'as pas besoin de la table2, sauf pour la restriction, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select *
     
    from            table1 as t1
     
    left outer join table3 as t3
    on  t3.colonneX = t1.colonneX
     
    where exists (select 1 from table2 as t2 where t2.colonneY = t3.colonneY and t2.colonneZ = xx);
    Le mieux serait de nous donner le descriptif de tes trois tables, avec un jeu d'essai et de nous indiquer le résultat que tu veux obtenir au final.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    @artemus24
    Dans ta dernière requête, en plaçant une condition sur une colonne de table3 dans la clause WHERE, tu forces la jointure en jointure interne.
    En effet, seules les lignes où t3.colonneY n'est pas NULL seraient retenues.

    Il faut donc déplacer cette restriction dans la condition de jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select  *
    from    table1  as t1
        left outer join 
            table3  as t3
            on  t3.colonneX = t1.colonneX
            and exists 
                (   select  null
                    from    table2  as t2 
                    where   t2.colonneZ = xx
                        and t2.colonneY = t3.colonneY 
                )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut al1_24.

    Oui, tu as tout à fait raison !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. autocomplete avec select dans un autre champ
    Par eomer212 dans le forum jQuery
    Réponses: 8
    Dernier message: 24/04/2013, 19h03
  2. Combobox variant selon la selection dans une autre combobox.
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/03/2008, 10h20
  3. Référence à une colonne dans un autre select
    Par vlefevre dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/01/2008, 09h48
  4. Afficher un select en fonction du choix dans un autre select.
    Par JackBeauregard dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/03/2007, 18h51
  5. récupérer la valeur d'un select dans un autre
    Par alexander dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/03/2005, 19h43

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