Het aantal en de namen van kolommen moeten worden vastgesteld op het moment dat u de query voorbereidt. Dat is precies de manier waarop SQL werkt.
Je hebt dus twee keuzes om dit op te lossen. Beide keuzes omvatten het schrijven van applicatiecode:
(1) Vraag de verschillende waarden op van way
en schrijf vervolgens code om deze te gebruiken om de spilquery te construeren, waarbij zoveel kolommen in de SELECT-lijst worden toegevoegd als het aantal verschillende waarden.
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`";
Nu kunt u de nieuwe query uitvoeren, en deze heeft net zoveel kolommen als het aantal verschillende way
waarden.
$pivotstmt = $pdo->query($pivotsql);
(2) De gegevens rij voor rij opvragen zoals het is gestructureerd in uw database, en schrijf vervolgens code om in kolommen te draaien voordat u de gegevens weergeeft.
$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"];
}
Nu heb je een array van arrays die er hetzelfde uitziet alsof je een pivot-query had uitgevoerd, maar de eigenlijke SQL die je uitvoerde was een stuk eenvoudiger. Je hebt het zoekresultaat nabewerkt in een andere reeks arrays.