Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Introduction aux jointures avec mySQL

Article posté le 01-02-2014 dans la catégorie SQL

Les requêtes simples, c'est bien beau. Mais une accumulation de requêtes simples, ça l'est moins! Si vous devez lire des données dans une table mais que ces données nécessitent auparavant ou après la lecture dans une autre, il peut être plus intéressant de faire une seule requête et ainsi simplifier votre code. J'ajouterai quelques exemples au fur et à mesure.

1- Généralités

Exemple 1 :

Soit deux tables, l'une contenant les joueurs, avec chacun un ID et un NOM

et une autre contenant une liste de matchs, avec pour chacun un ID, et l'ID des deux joueurs qui se sont affrontés : 

A présent, admettons que vous soyez intéressé par le match N°1. C'est bien beau, mais vous ne connaissez pas le nom du joueur 1 par exemple.

Sans jointure, vous devriez faire deux requêtes :

SELECT IDP1 FROM matches WHERE ID = 1

pour obtenir l'ID du joueur1, et ensuite

SELECT NOM FROM joueurs WHERE ID = (L'ID DE VOTRE JOUEUR)

Maintenant, vous pouvez faire cela en une seule requête :

SELECT NOM, IDP1
FROM joueur, matchs
WHERE matchs.IDP1 = joueur.ID
AND matchs.ID =1

Et résultat :

Pour information, il s'agit d'une jointure interne, voir explications plus bas dans cet article. Vous remarquerez que l'utilisation du mot-cléf JOIN n'est pas obligatoire pour les jointures internes.

Exemple 2 :

Ici nous allons utiliser des alias, pour la présentation des données. Nous avons deux tables :

Vous avez compris, le lien entre les deux tables est l'ID. Voici donc une requête : nous connaissons liste_id (9), et nous voulons tous les ID et les emails des personnes qui font partie de cette liste :

SELECT newsletter_abonnes.abo_email AS email, newsletter_abo_liste.abo_id AS identifiant
FROM newsletter_abonnes , newsletter_abo_liste
WHERE newsletter_abonnes.abo_id = newsletter_abo_liste.abo_id AND newsletter_abo_liste.liste_id= 9

Exemple 3

La suite de l'exemple précédent, sauf que je veux supprimer un enregistrement des deux tables, le champ commun étant donc abo_id :

DELETE id, email FROM newsletter_abo_liste id JOIN newsletter_abonnes email ON email.abo_id  = id.abo_id WHERE id.abo_id =

 

2- Les différents types de jointures

Il existe plusieurs types de jointure, combinables :


Tweet
comments powered by Disqus