首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL动态交叉标签

问MySQL动态交叉标签
EN

Stack Overflow用户
提问于 2012-01-23 20:04:58
回答 1查看 2.3K关注 0票数 4

我有一张这样的桌子:

代码语言:javascript
复制
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

我想要一张这样的桌子

代码语言:javascript
复制
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交叉选项卡(透视表),网上有很多解决方案,但是如果我不知道有多少种“方式”,我怎么能做到这一点呢?谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-01-23 20:17:07

在准备查询时,必须固定列的数目和名称。这就是SQL的工作方式。

所以你有两个选择来解决这个问题。这两种选择都涉及编写应用程序代码:

(1)查询不同的值( of way ),然后编写代码来使用这些值构造枢轴查询,并在SELECT列表中追加与不同值的数量相同的列。

代码语言:javascript
复制
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值的数量一样多。

代码语言:javascript
复制
$pivotstmt = $pdo->query($pivotsql);

(2)根据数据库中的结构逐行查询数据,然后编写代码,在显示数据之前将数据转到列中。

代码语言:javascript
复制
$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要简单得多。将查询结果后处理成一组不同的数组。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8977855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档