【问题标题】:SQL join data from multiple tables with MYSQL使用 MYSQL 连接来自多个表的数据
【发布时间】:2017-04-26 17:23:21
【问题描述】:

我有多个表和列字段并且都匹配数据类型和列号,并且都有一个时间字段也以YYYY-MM-DD HH:MM:SS 的格式匹配。

数据问题

我可能有一个表,其中在该表的 value 列中有一个具有匹配值的日期和时间戳,但在另一个表中它不会有相同的日期和时间戳,因为每个表只记录一个时间生成其他字段的值。

我的困境

我需要连接所有这些表(比如 20 个左右),以便它们的时间和值字段显示为每个表中的每个值都有一个单独的名称。

我还需要显示每个条目的时间,但我只需要一个时间字段,如果当时这些表中不存在其他值,则其他值为 Null。


示例表

表 A

+---------------------+-------+
| Time                | Value |
+---------------------+-------+
| 2016-12-11 00:00:15 | 15    |
| 2016-12-11 00:10:10 | 16    |
| 2016-12-11 00:12:00 | 17    |      
+---------------------+-------+

表 B

+---------------------+-------+
| Time                | Value |
+---------------------+-------+
| 2016-12-11 00:01:15 | 25    |
| 2016-12-11 00:11:10 | 26    |
| 2016-12-11 00:11:00 | 27    |      
+---------------------+-------+ 

TableC

+---------------------+-------+
| Time                | Value |
+---------------------+-------+
| 2016-12-11 00:02:15 | 35    |
| 2016-12-11 00:20:10 | 36    |
| 2016-12-11 00:21:00 | 37    |      
+---------------------+-------+

预期结果

+---------------------+-----------+-----------+-----------+
| Time                | Value_tba | Value_tbb | Value_tbc |
+---------------------+-----------+-----------+-----------+
| 2016-12-11 00:00:15 | 15        | Null      | Null      |
| 2016-12-11 00:10:10 | 16        | Null      | Null      |
| 2016-12-11 00:12:00 | 17        | Null      | Null      |
| 2016-12-11 00:01:15 | Null      | 25        | Null      |
| 2016-12-11 00:11:10 | Null      | 26        | Null      |
| 2016-12-11 00:11:00 | Null      | 27        | Null      |
| 2016-12-11 00:02:15 | Null      | Null      | 35        |
| 2016-12-11 00:20:10 | Null      | Null      | 36        |
| 2016-12-11 00:21:00 | Null      | Null      | 37        |
+---------------------+-----------+-----------+-----------+

我的两个表解决方案

如果我使用 MYSQL 是唯一或最简单的方法,使用左连接,然后使用 UNION 或 UNION ALL 来填充我所期望的,或者甚至可以使用 SQL 语句来获得这个结果?我在下面有一个用于两个表的示例,但是当我需要在循环中抛出其他表时,我没有得到预期的结果。

这是我使用的两个表,这似乎可以满足我的需要,但是当我需要将其他表添加到组合中时,我很困惑将所有表放入同一个选择中并添加额外的LEFT JOIN 或者如果我需要分别填充它们然后 UNION ALL。

SELECT a.Time, a.Value Value_tba, b.value Value_tbb
FROM TableA a
LEFT JOIN TableB b ON b.Time=a.Time

UNION ALL

SELECT b.Time, a.Value Value_tba, b.value Value_tbb 
FROM TableB b
LEFT JOIN TableA a ON a.Time=b.Time

【问题讨论】:

  • “数据问题”这绝对是您所拥有的。为什么要创建 20 个保存相同数据的表?
  • 您的语句仍然显示错误的表结构。它应该是 device_id,time,值。一个表而不是 20 个(如果添加更多设备,可能会增加到 25 个)。这是非常标准的做法。
  • "不幸的是,在这种情况下没有 device_id。"那么你如何决定数据进入哪个表呢?
  • 那么可以使用相同的过程来分配任意设备 ID A、B、C 等
  • @e4c5 我同意,你完全正确!将讨论。

标签: mysql sql database left-join outer-join


【解决方案1】:

尝试以下方法:

select x.time, a.value as value_tba, b.value as value_tbb, c.value as value_tbc from (select time from a union select time from b union select time from c) x left join a on x.time = a.time left join b on x.time = b.time left join c on x.time = c.time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多