SQL + PHP : LEFT JOIN dans un tableau PHP

Résolu
le_joker_fou Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   -  
le_joker_fou Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   -
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. Utilisateur anonyme
     
    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
  2. Utilisateur anonyme
     
    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
    0
  3. le_joker_fou Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   239
     
    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.
    0
  4. Utilisateur anonyme
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. le_joker_fou Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   239
     
    Bonjour,

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

    Encore merci de ton aide.
    0