列的数量和名称必须在准备查询时确定。这就是 SQL 的工作方式。
所以你有两种选择来解决这个问题。两种选择都涉及编写应用程序代码:
(1)查询不同值 of 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
values.
$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 要简单得多。您将查询结果后处理到一组不同的数组中。