Antallet og navnene på kolonner skal være faste på det tidspunkt, du forbereder forespørgslen. Det er bare sådan SQL fungerer.
Så du har to valg af, hvordan du løser dette. Begge valg involverer at skrive ansøgningskode:
(1) Forespørg på de forskellige værdier af way
og skriv derefter kode for at bruge disse til at konstruere pivotforespørgslen, ved at tilføje lige så mange kolonner i SELECT-listen som antallet af distinkte værdier.
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 kan du køre den nye forespørgsel, og den har lige så mange kolonner som antallet af distinkte way
værdier.
$pivotstmt = $pdo->query($pivotsql);
(2) Forespørg dataene række for række som det er struktureret i din database, og skriv derefter kode for at pivotere i kolonner, før du viser dataene.
$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 har du et array af arrays, der ser det samme ud, som hvis du havde kørt en pivot-forespørgsel, men den faktiske SQL, du kørte, var meget enklere. Du efterbehandlede forespørgselsresultatet til et andet sæt arrays.