列の数と名前は、クエリを準備するときに固定する必要があります。これがSQLの仕組みです。
したがって、これを解決する方法には2つの選択肢があります。どちらの選択肢にも、アプリケーションコードの記述が含まれます:
(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ははるかに単純でした。クエリ結果を別の配列セットに後処理しました。