SQL + PHP : LEFT JOIN dans un tableau PHP [Résolu/Fermé]

Signaler
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
-
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
-
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


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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

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
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
230
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.

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.
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
230
Bonjour,

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

Encore merci de ton aide.