【发布时间】:2017-12-14 12:31:59
【问题描述】:
我有 2 个 MySQL 表,我需要将它们作为派生表加入和访问。
带有一些虚拟行的基本示例:
CREATE DATABASE Test;
USE Test;
CREATE TABLE TableOne(
Id INT auto_increment NOT NULL,
SomeField FLOAT,
Timestamp DATETIME,
PRIMARY KEY(Id)
);
CREATE TABLE TableTwo(
Id INT auto_increment NOT NULL,
SomeField FLOAT,
Timestamp DATETIME,
PRIMARY KEY(Id)
);
INSERT INTO TableOne
(Timestamp, SomeField)
VALUES
('2017-06-30 23:30:00', RAND()),
('2017-06-30 23:45:00', RAND()),
('2017-07-01 00:00:00', RAND()),
('2017-07-01 00:15:00', RAND()),
('2017-07-01 00:30:00', RAND()),
('2017-07-01 00:45:00', RAND()),
('2017-07-01 01:00:00', RAND()),
('2017-07-01 01:15:00', RAND()),
('2017-07-01 01:30:00', RAND());
INSERT INTO TableTwo
(Timestamp, SomeField)
VALUES
('2017-06-30 23:30:00', RAND()),
('2017-06-30 23:40:00', RAND()),
('2017-06-30 23:50:00', RAND()),
('2017-07-01 00:00:00', RAND()),
('2017-07-01 00:10:00', RAND()),
('2017-07-01 00:20:00', RAND()),
('2017-07-01 00:30:00', RAND()),
('2017-07-01 00:40:00', RAND()),
('2017-07-01 00:50:00', RAND()),
('2017-07-01 01:00:00', RAND()),
('2017-07-01 01:10:00', RAND()),
('2017-07-01 01:20:00', RAND()),
('2017-07-01 01:30:00', RAND());
为了阅读表格,我正在使用:
SELECT
SomeField,
Timestamp
FROM
(
SELECT
SomeField,
Timestamp
FROM
TableOne
UNION
SELECT
SomeField,
Timestamp
FROM
TableTwo
) d1
WHERE
d1.Timestamp BETWEEN '2017-07-01 00:00:00' AND '2017-07-01 01:00:00'
ORDER BY
d1.Timestamp;
此查询返回下表:
+------------+---------------------+
| SomeField | Timestamp |
+------------+---------------------+
| 0.380433 | 2017-07-01 00:00:00 |
| 0.00938889 | 2017-07-01 00:00:00 |
| 0.963191 | 2017-07-01 00:10:00 |
| 0.290852 | 2017-07-01 00:15:00 |
| 0.674658 | 2017-07-01 00:20:00 |
| 0.483715 | 2017-07-01 00:30:00 |
| 0.426091 | 2017-07-01 00:30:00 |
| 0.394602 | 2017-07-01 00:40:00 |
| 0.257901 | 2017-07-01 00:45:00 |
| 0.521865 | 2017-07-01 00:50:00 |
| 0.425519 | 2017-07-01 01:00:00 |
| 0.0112322 | 2017-07-01 01:00:00 |
+------------+---------------------+
12 rows in set (0.00 sec)
Test.TableOne 中的时间戳(例如)每十五分钟一次。
Test.TableTwo 中的时间戳(例如)每十分钟一次。
我想要做的是返回带有 all 时间戳的派生表,其中“SomeField”列显示相应 DATETIME 的 Null。
一个示例(使用上表)如下所示:
+------------+---------------------+
| SomeField | Timestamp |
+------------+---------------------+
| 0.380433 | 2017-07-01 00:00:00 |
| 0.00938889 | 2017-07-01 00:00:00 |
| 0.963191 | 2017-07-01 00:10:00 |
| NULL | 2017-07-01 00:10:00 |
| 0.290852 | 2017-07-01 00:15:00 |
| NULL | 2017-07-01 00:15:00 |
| 0.674658 | 2017-07-01 00:20:00 |
| NULL | 2017-07-01 00:20:00 |
| 0.483715 | 2017-07-01 00:30:00 |
| 0.426091 | 2017-07-01 00:30:00 |
| 0.394602 | 2017-07-01 00:40:00 |
| NULL | 2017-07-01 00:40:00 |
| 0.257901 | 2017-07-01 00:45:00 |
| NULL | 2017-07-01 00:45:00 |
| 0.521865 | 2017-07-01 00:50:00 |
| NULL | 2017-07-01 00:50:00 |
| 0.425519 | 2017-07-01 01:00:00 |
| 0.0112322 | 2017-07-01 01:00:00 |
+------------+---------------------+
18 rows in set (0.00 sec)
我尝试了许多不同的 JOIN 来实现这一点,但都没有成功。
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
如果你只有一行的时间戳和两列的值都来自 tableone 和 tabletwo 会解决你的问题吗?
标签: mysql database select join union