首页  >  文章  >  数据库  >  如何在 MySQL 中动态创建具有不同列名的交叉表?

如何在 MySQL 中动态创建具有不同列名的交叉表?

Barbara Streisand
Barbara Streisand原创
2024-10-28 08:09:01161浏览

How to Dynamically Create Cross-Tabulations in MySQL with Varying Column Names?

MySQL 动态交叉表

问题:

考虑一个包含以下属性的表:方式”、“停止”和“时间”。目标是将这些数据转换为交叉表格式,其中列代表不同的“方式”值,行代表“停止”值。每个单元格包含对应“方式”和“停止”组合记录的最大“时间”。

动态解决方案:

MySQL 的限制规定了列名称和数字必须在查询执行期间修复。为了克服这一挑战,请考虑两种基于应用程序的方法:

选项 1:查询不同值

  • 使用 SELECT DISTINCT 查询检索不同的“way”值.
  • 通过将必要的 MAX(IF()) 子句附加到 SELECT 列表来动态构造数据透视查询。
  • 执行生成的数据透视查询以获得所需的交叉表结果。

选项 2:逐行处理

  • 使用简单的 SELECT * 查询逐行查询数据。
  • 创建一个关联数组,将“stop”存储为键,将“way”值和相应的“time”值存储为值。
  • 处理每一行,填充关联“stop”中的 way_n 值" 键的数组。

实现:

对于选项 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn