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

 MySQL Discussion :

pourquoi mettre un LEFT JOIN ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut pourquoi mettre un LEFT JOIN ?
    Bonjour,

    Je suis nullisme en SQL mais j'utilise MySQL (et SQLite parfois) pour des requêtes simples. Même InnoDB, je me suis débrouillé pour ne plus l'utiliser tellement c'était lent / MyISAM.

    Mais en retombant sur une requêtes que je faisais, qui se terminait par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM table1 LEFT join table 2
    ON table1.id = table2.id 
    WHERE table1.id = $id
    je me suis demandé pourquoi il y avait ce LEFT JOIN. Je l'ai donc tout bêtement supprimer pour écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM table1, table2
    WHERE table1.id = $id AND table1.id = table2.id
    et le résultat est le même.

    Y'a-t-il une différence entre les deux ou la seconde est une autre façon d'écrire strictement la même chose (sous-entendu : même processus côté MySQL).
    J'ai cru comprendre que c'était identique dans la doc MySQL mais donc la syntaxe c'est ',' dans le FROM et condition dans le WHERE / INNER JOIN dans le FROM et condition dans le ON ?

    Et en quoi LEFT JOIN est différent de INNER JOIN ?

    J'ai bien vu que tout ceci est dans la doc de MySQL mais je ne la trouve pas claire du tout.

    Merci.

  2. #2
    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
    INNER JOIN produit un résultat exactement semblable à celui de ton abominable syntaxe à virgule. Par contre, il est parfois plus efficace, beaucoup plus propre, notamment parce qu'il permet de voir de quel type de jointure il s'agit.

    Quant à LEFT JOIN, il conserve les ligne de la table1 qui n'aurait pas de correspondance dans la table2. Par exemple, les requêtes suivantes vont perdre les personnes sans adresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT nom, prenom, adresse
    FROM personnes P
      INNER JOIN adresses A on P.id_pers = A.id_pers ;
    
    
    -- équivalent beurk
    SELECT nom, prenom, adresse
    FROM personnes P, adresses A 
    WHERE P.id_pers = A.id_pers ;
    
    Pour les conserver, il faut utiliser une jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom, prenom, adresse
    FROM personnes P
      LEFT JOIN adresses A on P.id_pers = A.id_pers ;
    Je précise que P LEFT JOIN A est l'équivalent de A RIGHT JOIN P... autrement dit, la précision "LEFT" ou "RIGHT" désigne, dans l'ordre de l'écriture de la requête, la table obligatoire (càd celle dont on va toujours conserver les lignes).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut
    Voilà qui est clair ! Merci !

    En fait, j'avais bien utilisé LEFT JOIN, mais là, j'ai eu à faire ça sur 3 tables et je n'arrivais pas à voir la syntaxe avec JOIN, donc je suis passé au WHERE.

    Donc, déjà, si WHERE = INNER JOIN ça ne me va pas pusque je veux un LEFT JOIN. Et ensuite, tu dis que c'est beurk, et ça, j'aime pas

    Donc un LEFT JOIN avec 3 tables, ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM t1
    JOIN t2
    JOIN t3
    ON (t1.id = t2.id) AND (t2.id = t3.id)
    ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut
    Ca a l'air ok :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE t1,t2,t3 
    FROM t1 
      LEFT JOIN t2 ON t1.ref=t2.ref 
      LEFT JOIN t3 ON t1.ref=t3.ref
    C'est encore beurk ?

  5. #5
    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
    C'est parfait ! Je ne sais pas trop ce que peut donner un LEFT JOIN dans un DELETE, mais tu vas sans doute bientôt pouvoir nous le dire.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Par défaut
    ça marche comme je le souhaite
    Mais j'ai un autre problème, que je vais exposer dans un autre sujet...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/06/2007, 18h45
  2. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38
  3. Interbase et left join
    Par Zog dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/03/2004, 08h55
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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