Mysql
 sql >> Base de données >  >> RDS >> Mysql

Tableau croisé dynamique MySQL

Le nombre et les noms des colonnes doivent être fixés au moment où vous préparez la requête. C'est ainsi que fonctionne SQL.

Vous avez donc deux choix pour résoudre ce problème. Les deux choix impliquent l'écriture du code de l'application :

(1) Interroger les valeurs distinctes de way puis écrivez du code pour les utiliser pour construire la requête pivot, en ajoutant autant de colonnes dans la liste SELECT que le nombre de valeurs distinctes.

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`";

Vous pouvez maintenant exécuter la nouvelle requête, et elle a autant de colonnes que le nombre de way distincts valeurs.

$pivotstmt = $pdo->query($pivotsql);

(2) Interroger les données ligne par ligne tel qu'il est structuré dans votre base de données, puis écrivez du code pour pivoter dans les colonnes avant d'afficher les données.

$stoparray = array();
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
  $stopkey = $row["stop"];
  if (!array_key_exists($stopkey, $stoparray)) {
    $stoparray[$stopkey] = array("stop"=>$stopkey);
  }
  $waykey = "way_" . $row["way"];
  $stoparray[$stopkey][$waykey] = $row["time"];
}

Vous avez maintenant un tableau de tableaux qui ressemble à si vous aviez exécuté une requête pivot, mais le SQL réel que vous avez exécuté était beaucoup plus simple. Vous avez post-traité le résultat de la requête dans un autre ensemble de tableaux.