Mysql
 sql >> Database >  >> RDS >> Mysql

Scheda incrociata dinamica MySQL

Il numero e i nomi delle colonne devono essere corretti al momento della preparazione della query. Questo è solo il modo in cui funziona SQL.

Quindi hai due scelte su come risolverlo. Entrambe le scelte implicano la scrittura del codice dell'applicazione:

(1) Interroga i valori distinti di way e quindi scrivi il codice per utilizzarli per costruire la query pivot, aggiungendo tante colonne nell'elenco SELECT quanti sono i valori distinti.

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

Ora puoi eseguire la nuova query e ha tante colonne quante sono le distinte way valori.

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

(2) Interroga i dati riga per riga com'è strutturato nel tuo database, quindi scrivi il codice da trasformare in colonne prima di visualizzare i dati.

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

Ora hai una matrice di array che ha lo stesso aspetto di se avessi eseguito una query pivot, ma l'SQL effettivo che hai eseguito era molto più semplice. Hai post-elaborato il risultato della query in un diverso insieme di matrici.