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 :

Jointures entre deux LEFT OUTER JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut Jointures entre deux LEFT OUTER JOIN
    Bonjour,

    Je ne parviens pas à faire fonctionner une combinaison de jointures SQL.

    J'utilise 2 LEFT OUTER JOIN sur 2 tables car les données s'y trouvant n'existent pas forcément pour les conditions que je pose dans le WHERE mais je souhaite les récupérer malgré tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM ...
    INNER JOIN ...
    LEFT OUTER JOIN table1 ON (....)
    LEFT OUTER JOIN table2 ON (....)
    WHERE ...
    Le problème étant que je dois faire une jointure stricte entre table1 et table2.
    J'ai fais ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM ...
    INNER JOIN ...
    LEFT OUTER JOIN table1 ON (....)
    LEFT OUTER JOIN table2 ON (table2.champ1=table1.champ1....)
    WHERE ...
    Mais les lignes que je récupère ne sont pas celles désirées.
    Effectivement la jointure dans le ON n'opère pas car comme je suis dans le cadre d'un LEFT OUTER JOIN sur "table1", je récupère toujours toutes les données.

    Plus sommairement (car c'est dur à expliquer), je souhaite que le LEFT OUTER JOIN sur la table2 filtre les lignes retournées après le premier LEFT OUTER JOIN.

    Si je remplace le deuxième LEFT OUTER JOIN par un INNER JOIN, je ne récupère plus rien car le INNER JOIN est appliqué à l'ensemble de la requête...

    How to ???

    Je m'en sors pas !

    Merci !

  2. #2
    ced
    ced est actuellement connecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    Je n'ai pas tout bien saisi .
    Un petit exemple avec des données (ce que tu as dans les tables, ce que tu obtiens et ce que tu souhaiterais obtenir) pourrait nous permettre de t'aider .

    ced

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par speedev Voir le message
    je souhaite que le LEFT OUTER JOIN sur la table2 filtre les lignes retournées après le premier LEFT OUTER JOIN.
    Moi pas tout comprendre non plus et je dis +1 à ced mais je traduis ceci par le fait qu'il faut faire une sous requête avec le premier LEFT OUTER JOIN et l'utiliser pour le deuxième LEFT OUTER JOIN

  4. #4
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut
    Ok.

    En fait l'intitulé de mon premier post était "Faire un IN dans un ON d'un LEFT JOIN" .
    J'ai bien voulu faire une sous-requête dans le premier LEFT JOIN et qui m'aurait justement permis de ne pas utiliser un deuxième LEFT JOIN seulement je n'ai pas pu la faire fonctionner d'où mon doute sur l'utilisation de sous requêtes dans un ON.

    Voici un exemple peut être plus clair :

    Une table joignant un article aux opérations de soldes : lnk_art_sol
    Une table contenant les articles : articles
    Une table contenant les soldes : soldes
    Une table contenant les articles par saisons : lnk_art_sai

    Je souhaite récupérer tous les articles de la saison en cours (conditions faite sur des dates dans le WHERE) AINSI que les articles soldés pour lesquels la SOLDE appliquée EXISTE BIEN dans la table SOLDES car il est possible que je doive traiter des pb d'intégrité de données (je n'ai pas la main sur les données qui viennent de mon client).

    Donc à la base j'ai fais une requête de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT art_id, art_lib, art_prx, art_prx_sol
    FROM lnk_art_sai L
    INNER JOIN articles A ON (A.art_sai = L.las_sai)
    LEFT JOIN lnk_art_sol S ON (A.art_id = S.lna.art)
    LEFT JOIN soldes O ON (S.lna_sol = O.sol_id)
    WHERE [conditions de filtration des données]
    Cette requête n'étant pas correct car pour les articles soldés (table lnk_art_sol) elle ne récupère pas UNIQUEMENT ceux dont la solde existe (table soldes).

    J'ai donc ensuite testé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT art_id, art_lib, art_prx, art_prx_sol
    FROM lnk_art_sai L
    INNER JOIN articles A ON (A.art_sai = L.las_sai)
    LEFT JOIN lnk_art_sol S ON (A.art_id = S.lna.art AND S.lna_sol IN (SELECT sol_id FROM soldes))
    WHERE [conditions]
    J'ai testé avec EXISTS à la place du IN mais sans succès.

    Ma vraie requête est plus costaud que cet exemple mais c'est très exactement le même soucis que j'essaye de régler.

    J'espère avoir pu faire plus clair pour vous

    Merci

  5. #5
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut
    Ok désolé on oublie, j'ai trouvé l'erreur.
    Tout ce temps perdu pour une inversion de champ dans la condition du left join.
    à 2 lettres près j'étais bon seulement MYSQL ne me renvoyait aucune erreur puisque le champ existait bien.

    Quel idiot...

    Merci tchaw

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    J'espere avoir compris correctement la demande...
    Je te laisse mettre en place les noms correctes des colonnes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT art_lib, art_prx, art_prx_sol
    FROM articles
    LEFT JOIN soldes ON (jointure sur id article)
    WHERE articles.art_id IN (
    	SELECT ID_ARTICLE_SAISONS FROM lnk_art_sai WHERE [conditions de date]
    	UNION
    	SELECT ID_ARTICLE_SOLDE FROM soldes WHERE [conditions]
    	)
    ---
    Farid

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

Discussions similaires

  1. [2008] Left Outer Join entre deux mêmes tables
    Par jslpfasc2 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/03/2014, 16h10
  2. [AC-2003] Probleme jointure left outer join
    Par Ardiden31 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/04/2012, 08h47
  3. [MySQL] Requête & Jointure LEFT OUTER JOIN
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/03/2012, 14h22
  4. Jointure LEFT OUTER JOIN , aide demandée :)
    Par fraginfo dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/10/2006, 11h02
  5. Problème de jointure avec INNER JOIN et LEFT OUTER JOIN
    Par tonio-lille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/02/2006, 12h45

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