Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Non-Officiels > Site Web > PHP > Base de données > Lecture du tutoriel

Les jointures, moyen d'économiser des ressources

Avatar
Auteur : patami
Créé : le 11/06/2006 12:04:46
Modifié : le 01/05/2007 22:28:20
Noter et commenter ce tutoriel
Imprimer ce tutoriel
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)
Via ce tutorial, vous allez apprendre une technique d'optimisation de vos requêtes sql, et par la même occasion de votre base de donnée. Car créer une base de donnée ne se fait sur un coup de tête, au hasard ! Cela demande une réelle réflexion quant à sa structure et les liaisons entre les différentes tables.

Bonne lecture ;)

Les jointures externes

Le LEFT JOIN est donc une commande SQL permettant d'optimiser fortement vos requêtes. Découvrons-le ensembles ...

Soit 2 tables :

articles

idtitretexteref_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 : SQL
1
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 : SQL
1
2
3
4
SELECT * 
FROM articles 
LEFT JOIN users 
ON articles.ref_auteur = users.id


Notre sélection sous forme de tableau donnerait :

idtitretexteref_auteurid
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 !


Note : comme vous le voyez dans cet exemple, on utilise la commande AS pour renommer un champ ;)
Si vous le désirez, vous pouvez utiliser ces champs renommés dans votre requête. Dans notre exemple vous auriez pu mettre pour le critère de liaison : ON articles.ref_auteur = user_id


Notez enfin que vous pouvez faire plusieurs LEFT JOIN dans une même requête :

Code : SQL
1
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 : SQL
1
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



Voilà c'est déjà la fin du tuto, j'espère que vous avez bien compris le principe, et que j'aurai contribué à l'amélioration du bien être des serveurs qui, chaque jour, encaissent des milliers de requêtes sql inutiles ^^
Auteur : patami
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 300 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.018s (0.0075s)