Броят и имената на колоните трябва да бъдат фиксирани по време на подготовката на заявката. Това е просто начинът, по който работи SQL.
Така че имате два избора как да разрешите това. И двата варианта включват писане на код на приложение:
(1) Запитване за различните стойности от way
и след това напишете код, за да ги използвате за конструиране на обобщената заявка, като добавите толкова колони в списъка SELECT, колкото е броят на отделните стойности.
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`";
Сега можете да стартирате новата заявка и тя има толкова колони, колкото е броят на отделните way
стойности.
$pivotstmt = $pdo->query($pivotsql);
(2) Запитвайте данните ред по ред както е структурирано във вашата база данни, и след това напишете код, който да се завърти в колони, преди да покажете данните.
$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"];
}
Сега имате масив от масиви, който изглежда по същия начин, както ако сте изпълнили обобщена заявка, но действителният SQL, който сте изпълнили, е много по-прост. Вие сте обработили резултата от заявката в различен набор от масиви.