将两个mysql表合并为一行
Posted
技术标签:
【中文标题】将两个mysql表合并为一行【英文标题】:Combining two mysql tables into one row 【发布时间】:2019-11-08 14:38:35 【问题描述】:我正在尝试将几个表格组合成一行。
团队表:
+----+-------+
| id | team |
+----+-------+
| 10 | Team1 |
| 11 | Team2 |
| 12 | Team3 |
+----+-------+
位置表:
+----+-----------+
| id | location |
+----+-----------+
| 1 | location1 |
| 2 | location2 |
| 3 | location3 |
+----+-----------+
停止表:
+----+---------+-------------+---------------------+
| id | team_id | location_id | timestamp |
+----+---------+-------------+---------------------+
| 1 | 10 | 2 | 2019-11-07 15:27:42 |
| 2 | 10 | 3 | 2019-11-07 16:37:52 |
| 3 | 10 | 4 | 2019-11-07 17:47:62 |
+----+---------+-------------+---------------------+
希望创建所需的表:
+----+---------+---------------------+---------------------+---------------------+
| id | team_id | (loc id=2) | (loc id=3) | (loc id=4) |
+----+---------+---------------------+---------------------+---------------------+
| 1 | 10 | 2019-11-07 15:27:42 | 2019-11-07 16:37:52 | 2019-11-07 17:47:62 |
| 2 | 11 | | | |
| 3 | 12 | | | |
+----+---------+---------------------+---------------------+---------------------+
位置的数量总是有限的。
任何指导将不胜感激!我已经尝试了一些 LEFT JOINS,但还没有走远。
【问题讨论】:
请展示你的尝试,并解释为什么它们还不够远。 您应该添加更多信息,如果给定团队和给定位置的停止表中有两个以上的条目会发生什么?你想最近停止吗?最后一站?所有的站点? 【参考方案1】:你可以做条件聚合:
select
t.id team_id
max(case when s.location_id = 2 then timestamp end) loc_id_2,
max(case when s.location_id = 3 then timestamp end) loc_id_3,
max(case when s.location_id = 4 then timestamp end) loc_id_4
from
team t
left join stops s on s.team_id = t.id
group by t.id
如果您想为生成的结果动态生成一个id
列(这没什么意义,因为您已经为每个team_id
获得了一条记录),那么您可以使用row_number()
(在mysql 8.0 及更高版本中可用):
select
row_number() over(order by t.id) id,
t.*
from (
select
t.id team_id,
max(case when s.location_id = 2 then timestamp end) loc_id_2,
max(case when s.location_id = 3 then timestamp end) loc_id_3,
max(case when s.location_id = 4 then timestamp end) loc_id_4
from
team t
left join stops s on s.team_id = t.id
group by t.id
) t
【讨论】:
非常感谢专线小巴!这帮助很大!完全不知道 SQL 中的 CASE! 欢迎@TCConway!以上是关于将两个mysql表合并为一行的主要内容,如果未能解决你的问题,请参考以下文章