将两个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表合并为一行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongify 将两个表合并为一个

怎样一个表中的2个查询结果合并到一个表中的两列

如何用sql语句将多行合并成一行

mysql多表查询合并到一个临时表,怎么再加一列并把各自的表名加上?

如何将MYSQL数据库 2个同样的数据库合并在一起?

mysql如何合并两条记录,或者将查询出来的结果相连