MySQL - Jointure et In

Avertissement :


Au sujet de ce type de fonctions:
mysql_connect() mysql_error() mysql_fetch_assoc() mysql_fetch_row() mysql_num_rows() mysql_query() mysql_select_db()

Ces fonctions ou extensions sont obsolètes depuis PHP 5.5.0, et ont été supprimées en PHP 7.0.0. à la place, vous pouvez utiliser l'extension MySQLi ou l'extension PDO_MySQL. Voir aussi MySQL : choisir une API du guide et ces entrées de la FAQ pour plus d'informations. Alternatives à cette fonction :
mysqli_connect()
PDO::__construct()

MySQL - Jointure et In

Dans ce tutoriel vous aller voir les différentes solutions pour sélectionner des enregistrements qui ont un point commun sur plusieurs tables en même temps. Le produit cartésien est le plus simple à mettre en place mais il demande beaucoup en ressource serveur, je vous recommande les jointures ou les requêtes imbriquées qui vont beaucoup plus vite en traitement.

Pour sélectionner des enregistrements dans des tables différentes, il existe 3 solutions :
  • Le produits cartésiens
  • Les jointures
  • Les requêtes imbriquées
Sommaire :

MySQL - Jointure et In

Le produit cartésien.
Soit: table1(attribut1,attribut2) et table2(attribut2,attribut3)

Le produit cartésien produira :

table1*table2(table1.attribut1,table1.attribut2,table2.attribut2,table2.attribut3)

Nous aurons donc
table1 a 1 b 2
table2 1 300 2 400


table1*table2
a 1 1 300
a 1 2 400
b 2 1 300
b 2 2 400


SELECT nomattribut1,...,nomattributN FROM nomdetable1,nomdetable2,....,nomdetableN WHERE condition;

Cependant cette méthode est à éviter car elle est lente et elle fournit des doublons .
Les jointures :
table1
a 1
b 2

table2
1 300
2 400

table
a 1 300
b 2 400


L'exemple ci-dessus est le cas d'une jointure dite NATURELLE, elle est associative et commutative.

Cas théorique d'une jointure naturelle, c'est à dire table1.attribut2=table2.attribut2

SELECT nomattribut1,...,nomattributN FROM nomdetable1 INNER JOIN nomdetable2 ON nomdetable1.nomattribut=nomdetable2.nomattribut WHERE conditions;
Les requêtes imbriquées :
A savoir
Les requêtes imbriquées se lisent de bas en haut (on lit d'abord la dernière requête) et elles peuvent être remplacées par des jointures mais la réciproque est fausse.

SELECT nomattribut FROM nomdetable WHERE nomattribut IN(SELECT nomattribut FROM nomdetable WHERE condition);

Exemple :

Article_librairie(idl,nom,#codec)
Categorie(codec,prix)



Le produit cartésien :

SELECT nom FROM article_librairie,categorie;

Les jointures :

SELECT nom FROM article_librairie INNER JOIN catégorie ON article_librairie.codec=categorie.codec;

Les requêtes imbriquées :

SELECT prix FROM catégorie WHERE codec IN (SELECT codec FROM article_librairie WHERE nom='mybook');

Remarque :
De la même façon on peut utiliser l'opérateur NOT IN