Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Le LEFT JOIN est donc une commande SQL permettant d'optimiser fortement vos requêtes. Découvrons-le ensembles ...
Soit 2 tables :
articles
| id | titre | texte | ref_auteur |
|---|
| 1 |
Blibli |
blablablabla .. |
2 |
| 2 |
Bloblo |
blablablabla |
1 |
| 3 |
Blublu |
bla bla etc |
4 |
| 4 |
Bleble |
encore blabla |
2 |
| 5 |
Blybly |
et blabla ! |
3 |
users
| id | prenom | nom |
|---|
| 1 |
Jacques |
Dupont |
| 2 |
Marcel |
Dubois |
| 3 |
Jeanne |
Dumont |
| 4 |
David |
Duchemin |
Nous désirons afficher un article en spécifiant le titre, le texte, ainsi que le nom et prénom de l'auteur. Pour faciliter la gestion, les données sur les auteurs, souvent réutilisées, sont stockées dans une 2e table. Dans le champ ref_auteur de la table articles, on a des nombres. Ils correspondent en fait à un id de la table users (par exemple, pour notre premier article on a comme ref_auteur
2. Cela équivaut à l'id
2 dans la table users soit Marcel Dubois).
Comment récupérer les informations de la 2e table et les mettre en relation avec la 1ère ?
Souvent, les codeurs font une première requête qui sélectionne l'article. Ils ont ainsi sélectionné l'id de référence (ref_auteur dans notre exemple), et font alors une 2e requête sql où ils sélectionnent l'auteur selon son id dans la table users. S'ils doivent faire une liste, avec une boucle, ils mettent alors la seconde requête dans la boucle.
ERREUR ! Multiplier de cette manière une requête sql est la pire des choses que l'on puisse faire à un serveur, c'est le meilleur moyen pour ralentir au maximum l'affichage de la page !
Comment remédier à cela ?
Faire une sélection sql digne de ce nom : utiliser le "LEFT JOIN".
Sa syntaxe est simple, il est à placer
avant les critères de sélection
WHERE,
LIMIT et
ORDER BY et
après le
FROM table, soit :
Code : SQL1
2
3
4
5 | SELECT *
FROM table1
LEFT JOIN table2
ON table1.champ_ref = table2.id
WHERE table1.id = x
|
On constate que l'on met
LEFT JOIN puis le nom de la seconde table. On met ensuite le critère d'ajout de la table. Il vous faut penser de cette manière : le left join consiste à ajouter les colonnes de la 2e table à la suite (donc à droite) de celles de la 1ère table. Pour savoir quel champ doit se placer où, on utilise ensuite le
ON qui définit un critère de liaison des deux tables.
Dans notre exemple, cela donnerait :
Code : SQL1
2
3
4 | SELECT *
FROM articles
LEFT JOIN users
ON articles.ref_auteur = users.id
|
Notre sélection sous forme de tableau donnerait :
| id | titre | texte | ref_auteur | id | prenom | nom |
|---|
| 1 |
Blibli |
blablablabla .. |
2 |
2 |
Marcel |
Dubois |
| 2 |
Bloblo |
blablablabla |
1 |
1 |
Jacques |
Dupont |
| 3 |
Blublu |
bla bla etc |
4 |
4 |
David |
Duchemin |
| 4 |
Bleble |
encore blabla |
2 |
2 |
Marcel |
Dubois |
| 5 |
Blybly |
et blabla ! |
3 |
3 |
Jeanne |
Dumont |
De fait, la liaison entre nos deux tables se fait au niveau des champs ref_auteur (de la table articles) et id (de la table users).
Pour diminuer le risque d'erreurs, on utilisera toujours de préférence une liaison numérique, plutôt qu'une liaison textuelle. C'est là que vous vous rendez compte de l'importance du champ id dans une table.
Notez que l'on se retrouve alors avec deux champs du même nom (id). Si vous avez besoin de faire appel à un des deux champs, cela posera alors problème (vu que le serveur ne saura pas quelle colonne est la bonne). Il est donc conseillé de préciser dans la sélection tous les champs que vous désirez utiliser, en renommant ceux portant le même nom.
Dans notre exemple :
Code : SQL 1
2
3
4
5
6
7
8
9
10 | SELECT articles.id AS id_article,
articles.titre,
articles.texte,
articles.ref_auteur,
users.id AS user_id,
users.prenom,
users.nom
FROM articles
LEFT JOIN users
ON articles.ref_auteur = users.id
|
Attention : n'oubliez pas de bien sélectionner tous les champs que vous utilisez dans la requête ! Par exemple nous n'aurons pas besoin du champ ref_auteur plus tard, vu que l'on a le champ id de la table users, cependant on utilise ce champ dans notre requête, il faut donc bien le sélectionner !
Notez enfin que vous pouvez faire plusieurs LEFT JOIN dans une même requête :
Code : SQL1
2
3
4
5
6
7 | SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.champ_ref
LEFT JOIN table3
ON table1.id = table3.ref
WHERE table1.id = 3
|
Vous pouvez même refaire un LEFT JOIN avec la même table en utilisant un autre critère de liaison (mais il faudra alors la renommer ainsi : LEFT JOIN table2 AS table3 pour pouvoir la distinguer dans votre sélection)
Exemple :
Code : SQL1
2
3
4
5
6
7
8
9 | SELECT table1.id,
table1.champ,
table2.champ_ref,
table2.autre_champ,
table3.ref,
table3.autre_champ AS champ_b
FROM table1
LEFT JOIN table2 ON table1.id = table2.champ_ref
LEFT JOIN table2 AS table3 ON table1.id = table3.ref
|