sql >> Base de Datos >  >> RDS >> Mysql

Tabla cruzada dinámica de MySQL

El número y los nombres de las columnas deben fijarse en el momento de preparar la consulta. Así es como funciona SQL.

Así que tienes dos opciones de cómo resolver esto. Ambas opciones implican escribir el código de la aplicación:

(1) Consultar los distintos valores de way y luego escriba el código para usarlos para construir la consulta dinámica, agregando tantas columnas en la lista SELECT como el número de valores distintos.

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

Ahora puede ejecutar la nueva consulta, y tiene tantas columnas como el número de way distintas valores.

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

(2) Consultar los datos fila por fila como está estructurado en su base de datos, y luego escriba código para pivotar en columnas antes de mostrar los datos.

$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"];
}

Ahora tiene una matriz de matrices que se ve igual que si hubiera ejecutado una consulta dinámica, pero el SQL real que ejecutó fue mucho más simple. Posprocesaste el resultado de la consulta en un conjunto diferente de matrices.