Médiaforma

All posts tagged jointures

Pour mieux comprendre les différences entre les jointures simples et les jointures complexes, rien de tel que quelques exemples.

En utilisant l’interface Web phpMyAdmin, définissez la table categories composée de deux champs :

  • id_categorie de type int(11), auto incrémenté ;
  • nom de type text.

Et la table articles, composée de trois champs :

  • id_categorie de type int(11), auto incrémenté ;
  • titre de type text ;
  • catégorie de type int(11).

Ajoutez les données suivantes dans la table categories :

Et ajoutez les données suivantes dans la table articles :

Vous allez maintenant utiliser l’onglet SQL pour appliquer des requêtes SQL sur les tables categories et articles.

Commencez par définir une jointure simple sur les champs categorie de la table articles et id_categories de la table categories :

SELECT * FROM articles, categories
WHERE articles.categorie = categories.id_categorie

Exécutez cette requête.

Voici le résultat. Vous remarquez que les articles d’id 8 et 9 ainsi que la catégorie 5 ne font pas partie des résultats. Ceci est “normal” puisqu’aucune correspondance n’existe entre les champs categorie de la table articles et id_categorie de la table categories :

Essayons la même requête, mais cette fois-ci en utilisant un INNER JOIN :

SELECT * FROM articles INNER JOIN categories
ON articles.categorie = categories.id_categorie;

Vous pouvez vérifier que le résultat est identique.

Essayons la même requête mais cette fois-ci en utilisant un LEFT JOIN :

SELECT * FROM articles LEFT JOIN categories
ON articles.categorie = categories.id_categorie;

Cette fois-ci, les enregistrements de la première table qui n’ont pas de correspondance dans la deuxième font partie des résultats :

Notre quatrième et dernier essai utilisera un RIGHT JOIN :

SELECT * FROM articles RIGHT JOIN categories
ON articles.categorie = categories.id_categorie;

Cette fois-ci, les enregistrements de la deuxième table qui n’ont aucune correspondance dans la première font partie des réponses :


Ecrivez le code permettant d’afficher les résultats sous la forme d’un tableau dans lequel les champs OrderID et Customer ne sont pas répétés s’ils sont identiques. Voici le résultat demandé :

Solution

Faites une pause dans la vidéo et écrivez le code demandé. Vous pourrez reprendre le visionnage de la vidéo pour prendre connaissance de la solution.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Jointure entre deux tables</title>
    <style>
      td { padding-right: 30px;}
    </style>
  </head>
  <body>
    <?php
      try {
        $base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');
      }
      catch(exception $e) {
        die('Erreur '.$e->getMessage());
      }
      $base->exec("SET CHARACTER SET utf8");
        $retour = $base->query("SELECT * FROM orders as o, order_details as d WHERE o.OrderID=d.OrderID");
      echo "<table>";
      $memoid=0;
      while ($data = $retour->fetch()){
        if ($memoid == $data['OrderID']){
          echo "<tr><td></td><td></td>";
          echo "<td>".$data['Product']."</td></tr>";
        }
        else{
          $memoid=$data['OrderID'];
          echo "<tr><td>".$data['OrderID']."</td>";
          echo "<td>".$data['Customer']."</td>";
          echo "<td>".$data['Product']."</td></tr>";
        }
      }
      echo "</table>";
      $base = null;
    ?>
  </body>
</html>

Une grande partie du code de la rubrique précédente est conservé. Seule la logique d’affichage diffère.

Pour ne pas répéter les champs OrderId et Customer, il suffit de comparer la valeur du champ OrderID de l’enregistrement courant et de l’enregistrement précédent. S’ils sont égaux, les champs OrderID et Customer ne doivent pas être affichés. Dans le cas contraire, ils doivent être affichés.

Pour mémoriser la valeur du champ orderId de l’enregistrement précédent, on utilise une variable tampon nommée $memoid.

Avant d’accéder au premier enregistrement de la réponse, cette variable est initialisée à 0.

L’instruction fetch retourne le premier enregistrement de la réponse. Le champ OrderID est comparé à la variable $memoid. Comme ils sont différents, OrderID est mémorisé dans $memoid, puis les champs OrderID, Customer et Product sont affichés.

A la prochaine itération, si orderId est égal à $memoid, seul le champ product est affiché.

Ainsi de suite jusqu’à ce que tous les enregistrements aient été passés en revue.

 

Exécutez ce code dans Wamp Server. Le résultat est bien celui qui était attendu.


Les bases de données relationnelles (comme MySQL) permettent d’insérer plusieurs tables dans une base de données et de définir des relations entre les tables. Cette section va vous montrer comment travailler simultanément sur plusieurs tables en PHP en utilisant des “jointures”, c’est-à-dire en reliant les tables par l’intermédiaire d’un champ commun.

Jointures simples

A titre d’exemple, nous allons relier les tables orders et order_detail de la base de données northwind :

Comme vous pouvez le voir, ces deux tables sont reliées par le champ OrderID. En utilisant une requête SQL appropriée, il sera donc possible d’extraire des données de chacune des deux tables en reliant leurs enregistrements sur les valeurs communes du champ OrderID.

Plusieurs syntaxes sont possibles.

Sélection de tous les champs des tables orders et order_details pour lesquels le champ OrderID est identique dans les deux tables :

SELECT * FROM orders, order_details
 WHERE orders.OrderID=order_details.OrderID;

Instruction identique à la précédente, mais on utilise des alias sur les tables pour simplifier l’écriture :

SELECT * FROM orders as o, order_details as d
 WHERE o.OrderID=d.OrderID;

Sélection des champs OrderID de la table orders, Customer de la table orders et Product de la table order_details pour lesquels le champ OrderID est identique dans les deux tables :

SELECT orders.OrderID, orders.Customer, order_details.Product
 FROM orders, order_details
 WHERE orders.OrderID=order_details.OrderID;

Instruction identique à la précédente, mais on utilise des alias sur les champs pour simplifier l’écriture. Ces alias seront utilisés par la suite dans la boucle while qui récupère les données de la méthode fetch() :

SELECT orders.OrderID AS id,
 orders.Customer AS nom,
 order_details.Product AS produit
 FROM orders, order_details
 WHERE orders.OrderID=order_details.OrderID;

Passons à la pratique.

Nous allons lancer une requête SQL pour obtenir les champs suivants : OrderID (table orders), Customer (table orders) et Product (table order_detail).

Après avoir créé un objet PDO sur la base de données northwind :

$base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');

Une requête SELECT est exécutée pour obtenir des informations des tables orders et order_details :

$retour = $base->query("SELECT * FROM orders as o, order_details as d WHERE o.OrderID=d.OrderID");

Les données retournées sont alors parcourues avec une boucle while :

while ($data = $retour->fetch())