Les requêtes multi-tables avec MySQL

Les requêtes multi-tables avec MySQL

23 mar | Catégorie: PHP | Rédigé par François | 2637 lectures

Vous allez ici apprendre à interroger plusieurs tables d'une base de données dans une même requête. Concrètement, nous allons voir comment réaliser une requête qui demandera à nos 2 tables (actualités et commentaires) un tableau contenant les pseudos et textes des commentaires avec le titre de l'actualité correspondante.

 

Etape 1 : Introduction

Nous allons partir de tables déjà existantes que vous pourrez recréer avec ce code:


Notre but va donc être de faire correspondre un commentaire à une actualité dans la table actu_commentaires, ce qui définit l'actualité est la colonne id_actu. Notre but est de faire en sorte d'afficher le titre de l'actualité et non son identifiant. Pour illustrer mon propos, nous souhaiterions par exemple afficher ceci en une seule requête : "Stéphane a écris un commentaire dans "Inner Join ou Left Join?"". Nous allons pour cela exécuter une jointure interne, qui est une des jointure la plus courante.

Etape 2 : INNER JOIN ... ON

Nous allons utiliser pour "coller" nos 2 tables une requête de type INNER JOIN...ON, voici comment elle fonctionne:


En fait nous aurons après le mot clef "ON" le critère qui permet de joindre les 2 tables, ici nous voulons par exemple que l'identifiant "id_actu" corresponde à l'identifiant "id" de la table "actualités" comme pour le schéma ci-dessous:

schéma

A noter aussi que j'utilise une syntaxe "ma table" AS a qui correspond à la création d'un alias, celui-ci servant exclusivement à raccourcir notre requête dans le but d'écrire par exemple "a.titre" au lieu de "actualites.titre". Voici ce que l'on pourrait avoir comme requête pour joindre les 2 tables:


Etape 3: Un peu plus loin avec LEFT JOIN

LEFT JOIN fonctionne de manière très similaire à INNER JOIN, à la seule différence que s'il ne trouve pas d'associations, il remplit à NULL les autres champs. Vous en aurez l'utilité si par exemple vous voulez connaître quelles actualités n'ont aucun commentaires, en veillant à ajouter une clause "WHERE c.id IS NULL". On pourrait alors avoir ce genre de requête:


Conclusion

Cette petite introduction aux requêtes utilisant plusieurs tables est terminée, sachez aussi qu'il existe plusieurs autres types de jointures que je n'ai pas abordé dans ce tutorial.

Par ailleurs, vous pouvez aussi effectuer des requêtes sur plus de 2 tables assez facilement avec cette même méthode, il suffit d' additionner les INNER JOIN ... ON ...

Creative Commons License
Cette création par Snoupix.com est mise à disposition selon les termes de la licence Creative Commons.
Partager ce tutoriel :
wikio scoopeo fuzz diggfr digg-design blogmemes delicious tapemoi yoolink bluegger pioche

7 Commentaires

gravatar
le 08 avril à 13h04 Domi Répondre Peut paraitre élémentaire, mais quand c'est bien expliqué et clairement présenté,comme dans ce billet, la piqure de rappel devient bien sympathique.
Merci
gravatar
le 04 mai à 23h30 Axel Répondre Bon tuto.

Attention à la faute d'orthographe dans l'image de présentation de l'article smile
Il y a écrit "muTLI-table"
gravatar
le 05 mai à 17h01 François Répondre Ouah j'ai beau être passé 100 fois dessus j'avais pas remarqué!

smile

Bien vu
----------------------------------------------
modéré le 08/05 à 3h43
gravatar
le 20 juin à 13h05 hactar Répondre Super tuto !
Cela fait des heures que je cherchais à resoudre ce problème !

Merci beaucoup !
gravatar
le 11 juillet à 22h34 intégrateur html Répondre si possible le code source !!
gravatar
le 02 septembre à 22h38 lannoy Répondre Je doit dire que c'est asser pauvre, il ni a pas suffisament d'exemple comme par exemple pour compté le nombre d'entré dans un table ou l'id_sujet par exemple doit correspondre a l'id du autres table.
gravatar
le 03 septembre à 09h07 François Répondre Il s'agit comme je l'ai dit... d'une petite introduction, à la conception de requêtes sur plusieurs tables.
Sinon pour ta demande: il faudrait faire un "count(id_sujet) as total"
a+

Requête en cours, veuillez patienter...

Ajouter un commentaire