LEFT, RIGHT différence ?

Marin
Invité n'ayant pas de compte PHPfrance

20 juin 2006, 15:35

Bonjour

J'ai une question qui peut vous paraitre stupid, après avoir lu pas mal d'exemples sur les requêtes SQL, je n'arrive toujurs pas a saisir la nuance subtile entre un LEFT OUTER JOIN et un RIGHT OUTER JOIN, ce qui me pose problème, puisque je ne sais jamais lequel je dois utilisé dans mes requêtes.

Pourriez vous me l'expliquer simplement ?

J'ai beau lire et relire, j'arrive toujours pas à savoir lequel il faut utiliser des 2 :(

Merci d'avance.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

20 juin 2006, 15:40

Code : Tout sélectionner

SELECT col1 FROM tableA LEFT OUTER JOIN tableB ON col1 = col2
renvoie toutes lignes de la tableA, même si elle n'ont pas de correspondance dans la tableB

Code : Tout sélectionner

SELECT col1 FROM tableA RIGHT OUTER JOIN tableB ON col1 = col2
renvoie toutes lignes de la tableB, même si elle n'ont pas de correspondance dans la tableA

En conséquence, si tu remplaces LEFT par RIGHT, en inversant l'ordre des tables, ça revient au même.
Après laquelle utiliser, ça dépend de ce que tu veux faire.
Sachant qu'il vaut mieux utiliser LEFT je crois, souvent mieux implémenté et plus naturel.

Ici c'est bien expliqué : http://laltruiste.com/document.php?url= ... nture.html
Et dans le manuel MySQL il y a des infos sur ce qu'il vaut mieux utiliser :
http://dev.mysql.com/doc/refman/5.0/fr/join.html

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2006, 15:44

Sachant qu'il vaut mieux utiliser LEFT je crois, souvent mieux implémenté et plus naturel.
On peut dire que LEFT OUTER JOIN revient à faire OUTER JOIN donc plus simple à lire et il vaut toujours mieux mettre en 1er les tables qui contiennent les données qui nous intéresses le plus ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

20 juin 2006, 15:49

Imaginons un exemple absurde, mais simple :
tu as une table HOMME qui contient des noms d'homme et une table FEMME qui...
(c'est bien ! Apparemment, jusque là, tout le monde suit...) :lol:
Certains de ces hommes et femmes sont mariés (ils ont le même id, les autres sont célibataires)
SELECT H.h_id, F.f_id FROM homme H INNER JOIN femme F ON H.h_id=F.f_id
j'obtiens tous les couples composés d'un homme et d'une femme
ayant le même identifiant dans leurs tables respectives.
:arrow: hommes mariés, femmes mariées.

SELECT H.h_id, F.f_id FROM homme H LEFT JOIN femme F ON H.h_id=F.f_id
j'obtiens tous les hommes et seulement les femmes qui ont le même identifiant que leur mâle.
:arrow: hommes mariés et célibataires, femmes mariées.
SELECT H.h_id, F.f_id FROM homme H RIGHT JOIN femme F ON H.h_id=F.f_id
// ou
SELECT H.h_id, F.f_id FROM femme F LEFT JOIN homme H ON F.f_id=H.h_id
j'obtiens toutes les femmes et seulement les hommes qui ont le même identifiant que leur dame.
:arrow: hommes mariés, femmes mariées et célibataires.

Et si je lance la requête :
SELECT H.h_id, F.f_id FROM homme H, femme F
sans jointure, je crée un joli produit cartésien.
En d'autres termes, une partouze. :langue:

Bon, ben, j'vas rentrer, moi... ;)

Marin
Invité n'ayant pas de compte PHPfrance

20 juin 2006, 16:14

Merci beaucoup à vous 3 :P, c'est un peu plus clair, au début, je pensais que ça avait un rapport avec les noms des tables par ordre alphabétique et numérique....
La honte :oops:

Très bien ton explication albat, avec une pointe d'humour :D

Je viens d'essayer en mettant un simple OUTER JOIN, zeus, mais ça renvoi une erreur de syntaxe (mysql).

Bon, pour l'instant ma requête est faite à l'envers, donc, je vais utiliser les RIGHT.

En tout cas, encore merci, j'ai compris, reste à bien réfléchir dans la création de mes requêtes.