mysql交表,MySQL动态交叉表

我有这样一张桌子:

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交叉表(数据透视表)的在线有很多解决方案,但如果我不知道有多少“方式”,我怎么能这样做呢?

谢谢

解决方法:

必须在准备查询时修复列的数量和名称.这就是SQL的工作方式.

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

(1)查询方式的不同值,然后编写代码以使用它们构造数据透视查询,在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`";

现在,您可以运行新查询,并且它具有与不同方式值的数量一样多的列.

$pivotstmt = $pdo->query($sql);

(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要简单得多.您将查询结果后处理为一组不同的数组.

标签:mysql,aggregate-functions,pivot-table,crosstab

来源: https://codeday.me/bug/20190626/1292341.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
交叉查询,也称为交叉查询或者透视查询,是指在MySQL中对两个或多个进行联合查询,并将查询结果以交叉的形式展示出来的操作。 下面是一个简单的例子,假设我们有两个:学生和课程,它们的结构如下: 学生(students): | id | name | |----|-------| | 1 | Alice | | 2 | Bob | | 3 | Carol | 课程(courses): | id | course | score | |----|------------|-------| | 1 | Math | 90 | | 1 | English | 85 | | 2 | Math | 80 | | 2 | Physics | 95 | | 3 | Chemistry | 70 | | 3 | Geography | 75 | 现在我们想要得到每个学生的成绩情况,可以使用如下的交叉查询语句: ``` SELECT students.name, SUM(CASE WHEN courses.course = 'Math' THEN courses.score ELSE 0 END) AS Math, SUM(CASE WHEN courses.course = 'English' THEN courses.score ELSE 0 END) AS English, SUM(CASE WHEN courses.course = 'Physics' THEN courses.score ELSE 0 END) AS Physics, SUM(CASE WHEN courses.course = 'Chemistry' THEN courses.score ELSE 0 END) AS Chemistry, SUM(CASE WHEN courses.course = 'Geography' THEN courses.score ELSE 0 END) AS Geography FROM students LEFT JOIN courses ON students.id = courses.id GROUP BY students.name; ``` 这条语句的作用是将学生和课程进行左连接,然后使用CASE WHEN语句对每个学生的成绩情况进行统计,并以学生名字为分组条件进行聚合。最终的查询结果如下: | name | Math | English | Physics | Chemistry | Geography | |-------|------|---------|---------|-----------|-----------| | Alice | 90 | 85 | 0 | 0 | 0 | | Bob | 80 | 0 | 95 | 0 | 0 | | Carol | 0 | 0 | 0 | 70 | 75 | 以上就是一个简单的MySQL交叉查询的例子,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值