我有一张这样的桌子:
way stop time
1 1 00:55
1 2 01:01
1 3 01:07
2 2 01:41
2 3 01:47
2 5 01:49
3 1 04:00
3 2 04:06
3 3 04:12我想要一张这样的桌子
stop way_1 way_2 way_3 (way_n)
1 00:55 04:00
2 01:01 01:41 04:06
3 01:07 01:47 04:12
5 01:49关于MySQL交叉选项卡(透视表),网上有很多解决方案,但是如果我不知道有多少种“方式”,我怎么能做到这一点呢?谢谢
发布于 2012-01-23 20:17:07
在准备查询时,必须固定列的数目和名称。这就是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值的数量一样多。
$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要简单得多。将查询结果后处理成一组不同的数组。
https://stackoverflow.com/questions/8977855
复制相似问题