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. 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

      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. Bonjour,

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

            Encore merci de ton aide.