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 :

REQUET SQL LEFT JOIN


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Par défaut REQUET SQL LEFT JOIN
    Bonjour, je n'arrive pas à trouver la bonne requête pour résoudre ce problème :

    J'ai deux tables avec leurs champs :
    -table1(id1[clef], langue)
    -table2(id2[clef], id1[clef étrangère], infos)

    -la table1 contient les infos suivantes:
    (mark, EN)
    (ARNAUD, FR)
    (toto, ES)

    -la table2 contient les infos suivantes:
    (1, mark, student)


    => je dois sélectionner un enregistrement de la table1 et l'enregistrement de la table2 associé en se basant sur les champs 'langue' et 'infos'.
    si on a pas d'enregistrement de la table2 qui est associé à la table1 on doit retourner comeme l'enregistrement de la table1!

    voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM table1 AS A
    LEFT JOIN table2 AS B ON A.id1=B.id1
    WHERE A.langue='EN'
    AND (B.infos='prof' OR B.infos IS NULL)
    Mais ça ne retourne rien !
    Elle doit retourner comeme l'enregistrement de la table1 ! non ?

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Par défaut
    Salut,

    Ça me parait logique que ça te retourne rien.

    Donc ça ne concerne que mark.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (B.infos='prof' OR B.infos IS NULL)
    mark est un student donc ni prof ni null. Voila j'espère t'avoir aidé.

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Par défaut
    Oui tout à fait, mais en faisant un left join ma requête doit renvoyer l'enregistrement de la table1 même s' il n y a rien dans la table2.non?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Par défaut
    Attention tu confond. Désolé si j'explique mal mais WHERE fais les conditions après la demi-jointure donc ça te cache les résultats qui ne corresponde pas à tes critères. Les critères qui s'appliquent sur la demi-jointure sont défini avec le ON donc je pense que ce que tu veux faire correspondrai plus à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM table1 AS A
    LEFT JOIN table2 AS B ON A.id1=B.id1
    AND A.langue='EN'
    AND (B.infos='prof' OR B.infos IS NULL)

  5. #5
    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 : 73
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Keweed Voir le message
    Attention tu confond. Désolé si j'explique mal mais WHERE fais les conditions après la demi-jointure donc ça te cache les résultats qui ne corresponde pas à tes critères. Les critères qui s'appliquent sur la demi-jointure sont défini avec le ON donc je pense que ce que tu veux faire correspondrai plus à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM table1 AS A
    LEFT JOIN table2 AS B ON A.id1=B.id1
    AND A.langue='EN'
    AND (B.infos='prof' OR B.infos IS NULL)
    La piste est bonne, mais son exploitation erronée.
    Toute condition de la clause WHERE qui a trait a la table2 sera forcément fausse pour les lignes de la table1 pour lesquelles la jointures n'opère pas.
    A.langue='EN' concerne la table1, donc n'interfère pas avec le LEFT JOIN,
    par contre on peut faire migrer B.infos='prof' dans la clause ON de jointure, le LEFT JOIN rendant inutile la partie OR B.infos IS NULL
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT les_noms_de_colonnes_plutot_que_* 
    FROM table1 AS A
    LEFT JOIN table2 AS B 
    ON A.id1=B.id1 AND B.infos='prof' 
    WHERE A.langue='EN';
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Pour expliciter un peu plus la requête de Kris : un bon moyen de comprendre ce qui se passe est de penser que les clauses sont exécutées dans l'ordre (donc FROM d'abord et WHERE ensuite), ce qui est vrai logiquement, même si ça peut être faux physiquement.

    La requête de Keweed conserve les lignes sans correspondance entre A et B au niveau de la clause FROM, et les élimine ensuite lors du WHERE

    Celle de Kris calcule la correspondance en préfiltrant B sur infos='prof' ; du coup l'ensemble des lignes de A est conservé ; le WHERE n'éliminera ensuite que celle qui ne respectent pas la condition de langue.

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

Discussions similaires

  1. Requete avec Left Join sous MySQL 4 et 5
    Par gpers dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/05/2009, 18h04
  2. Réponses: 3
    Dernier message: 06/06/2007, 18h45
  3. [Access] Requête avec LEFT JOIN et 3 tables
    Par estelledany dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 13h27
  4. requete avec left join et group by
    Par slc dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2004, 18h03

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