SQL + PHP : LEFT JOIN dans un tableau PHP

Résolu
Bonjour,

J'exécute la requête suivante
SELECT table1.id, table1.nom, table2.id_table1, table2.nom FROM table1 LEFT JOIN table2 ON (table2.id_table1=table1.id);


Je cherche à obtenir le résultat dans un tableau PHP de ce type
0 => Table 1
		=> id
		=> nom
	=> Table 2
		=> id_table1
		=> nom
1 => Table 1
		=> id
		=> nom
	=> Table 2
		=> id_table1
		=> nom
2 => ...


Seulement je ne trouve aucune fonction SQL qui le fait ou aucune fonction PHP. Si quelqu'un peut me venir en aide.

Merci.

5 réponses

  1. Bonjour

    Sauf faute de frappe...
    $req= "SELECT table1.id, table1.nom, table2.id_table1, table2.nom FROM table1 LEFT JOIN table2 ON (table2.id_table1=table1.id)"; 
    $tbl=array(); 
    $res=mysql($req) or die(mysql_error()) ; // ou équivalent PDO 
    while ($ligne=mysql_fetch_array($res) { 
      $tbl[]=array( "Table 1"=> 
                      array($ligne['table1.id'],$ligne['table1.nom']), 
                    "Table 2"=> 
                      array($ligne['table2.id_table1'],$ligne['table2.nom'])); 
    } // while


    J'ai supposé, comme il n'y avait rien à gauche des => dans => id, que tu ne voulaias pas des tableaux associatifs à ce niveau là, sinon, il suffit d'ajouter les "id =>' et autres 'nom=>' aux bons endroits
    1. Merci pour la réponse, mais n'y a-t-il aucune méthode pour le faire de manière automatique?

      Car là j'ai fais un select de certains champs, mais comment faire si on remplace
      table1.id, table1.nom par table1.*
      ???

      Merci de ton aide.
      1. C'est sûrement possible, mais ça demande un peu plus de réflexion.
        En balayant les noms des champs récupérés par un mysql_fetch_assoc et en dissociant au niveau du point.
        Je te propose quelque chose dans l'après-midi.
        1. Beaucoup plus compliqué que je ne l'imaginais, car mysql ne crée pas des noms de colonnes en table.champ... Il a fallu faire autrement.
          Je suppose que les noms de tables sont sans caractères spéciaux, et en particulier sans espaces.
          Je l'ai fait avec PDO

          $table1="table1";
          $table2="table2";
          
          // on va créer une table avec les noms des champs dans l'ordre où ils seront récupérés par le fetch : il faut donc respecter l'ordre des tables du SELECT
          
          $listechamps=array();
          
          // récupère noms des champs de la 1ère table
          $res = $pdo->query("SHOW COLUMNS FROM $table1");
          while ($ligne=$res->fetch() ) {
            $listechamps[]=array($table1,$ligne['Field']);
          }
          // ajoute noms des champs de la 2ème table
          
          $res = $pdo->query("SHOW COLUMNS FROM $table2");
          while ($ligne=$res->fetch() ) {
            $listechamps[]=array($table2,$ligne['Field']);
          }
          
          $req= "SELECT $table1.*,$table2.* FROM $table1 LEFT JOIN $table2 ON  $table2.id_table1=$table1.id";
          $res=$pdo->query($req);
          $tbl=array(); // la table à créer
          $nligne=0;
          while ($ligne=$res->fetch(PDO::FETCH_NUM)) {
            for ($k=0;$k<count($ligne);$k++)
             $tbl[$nligne][$listechamps[$k][0]][$listechamps[$k][1]]=$ligne[$k];
            $nligne++;
          }
          var_dump($tbl);
          
          1. Bonjour,

            Merci à toi pour ce script, je sens qu'il va en aidé plus d'un.

            Encore merci de ton aide.