Tabulation croisée dynamique MySQL
Problème :
Considérez une table contenant des attributs tels que " chemin", "arrêt" et "heure". L'objectif est de transformer ces données dans un format croisé, où les colonnes représentent des valeurs « chemin » distinctes et les lignes représentent des valeurs « arrêt ». Chaque cellule contient le « temps » maximum enregistré pour la combinaison « chemin » et « arrêt » correspondante.
Solution dynamique :
Les limitations de MySQL dictent que les noms et numéros de colonnes doit être corrigé lors de l’exécution de la requête. Pour surmonter ce défi, envisagez deux approches basées sur les applications :
Option 1 : interroger des valeurs distinctes
Option 2 : Traitement ligne par ligne
Mise en œuvre :
Pour l'option 1 :
$way_array = []; foreach ($pdo->query("SELECT DISTINCT `way` FROM `MyTable`") as $row) { $way = (int) $row["way"]; $way_array[] = "MAX(IF(`way`=$way, `time`)) AS way_$way"; } $pivotsql = "SELECT stop, " . join(", ", $way_array) . "FROM `MyTable` GROUP BY `stop`"; $pivotstmt = $pdo->query($pivotsql);
Pour l'option 2 :
$stoparray = []; foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) { $stopkey = $row["stop"]; if (!array_key_exists($stopkey, $stoparray)) { $stoparray[$stopkey] = ["stop"=>$stopkey]; } $waykey = "way_" . $row["way"]; $stoparray[$stopkey][$waykey] = $row["time"]; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!