Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Tabulação cruzada dinâmica do MySQL


O número e os nomes das colunas devem ser fixados no momento em que você prepara a consulta. É assim que o SQL funciona.

Então você tem duas opções de como resolver isso. Ambas as opções envolvem escrever o código do aplicativo:

(1) Consultar os valores distintos de way e, em seguida, escreva o código para usá-los para construir a consulta dinâmica, anexando tantas colunas na lista SELECT quanto o 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`";

Agora você pode executar a nova consulta, e ela tem tantas colunas quanto o número de way distintos valores.
$pivotstmt = $pdo->query($pivotsql);

(2) Consultar os dados linha por linha como está estruturado em seu banco de dados e, em seguida, escreva o código para dinamizar as colunas antes de exibir os dados.
$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"];
}

Agora você tem uma matriz de matrizes que parece a mesma que se você tivesse executado uma consulta dinâmica, mas o SQL real que você executou era muito mais simples. Você pós-processou o resultado da consulta em um conjunto diferente de matrizes.