MySQL 动态交叉表
问题:
考虑一个包含以下属性的表:方式”、“停止”和“时间”。目标是将这些数据转换为交叉表格式,其中列代表不同的“方式”值,行代表“停止”值。每个单元格包含对应“方式”和“停止”组合记录的最大“时间”。
动态解决方案:
MySQL 的限制规定了列名称和数字必须在查询执行期间修复。为了克服这一挑战,请考虑两种基于应用程序的方法:
选项 1:查询不同值
选项 2:逐行处理
实现:
对于选项 1:
$way_array = []; 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`"; $pivotstmt = $pdo->query($pivotsql);
对于选项 2:
$stoparray = []; foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) { $stopkey = $row["stop"]; if (!array_key_exists($stopkey, $stoparray)) { $stoparray[$stopkey] = ["stop"=>$stopkey]; } $waykey = "way_" . $row["way"]; $stoparray[$stopkey][$waykey] = $row["time"]; }
以上是如何在 MySQL 中动态创建具有不同列名的交叉表?的详细内容。更多信息请关注PHP中文网其他相关文章!