对于不存在的记录,MySQL返回null

对于不存在的记录,MySQL返回null,mysql,database,select,join,union,Mysql,Database,Select,Join,Union,我有两个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_incremen

我有两个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”列显示对应日期时间的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)
我尝试了许多不同的连接来实现这一点,但运气不佳


任何帮助都将不胜感激。谢谢。

如果您只使用一行时间戳和两列,每个表中都有值,那么您可以使用更小的查询

但是,如果您真的需要像您要求的那样输出,则需要模拟两个完整的外部联接并将它们联合起来:

select * from (
           select t1.SomeField,Timestamp from TableOne t1 left join TableTwo t2 using (Timestamp) union all 
           select t2.SomeField,Timestamp from TableOne t1 left join TableTwo t2 using (Timestamp) union all
           select t1.SomeField,Timestamp from TableOne t1 right join TableTwo t2 using (Timestamp) union all 
           select t2.SomeField,Timestamp from TableOne t1 right join TableTwo t2 using (Timestamp)

          ) tt where tt.Timestamp BETWEEN '2017-07-01 00:00:00' AND '2017-07-01 01:00:00' order by Timestamp

如果只使用一个按时间戳的行和两个列以及每个表中的值,则可以使用更小的查询

但是,如果您真的需要像您要求的那样输出,则需要模拟两个完整的外部联接并将它们联合起来:

select * from (
           select t1.SomeField,Timestamp from TableOne t1 left join TableTwo t2 using (Timestamp) union all 
           select t2.SomeField,Timestamp from TableOne t1 left join TableTwo t2 using (Timestamp) union all
           select t1.SomeField,Timestamp from TableOne t1 right join TableTwo t2 using (Timestamp) union all 
           select t2.SomeField,Timestamp from TableOne t1 right join TableTwo t2 using (Timestamp)

          ) tt where tt.Timestamp BETWEEN '2017-07-01 00:00:00' AND '2017-07-01 01:00:00' order by Timestamp

如果只有一行按时间戳和两列同时包含表1和表2中的值,它会解决您的问题吗?如果只有一行按时间戳和两列同时包含表1和表2中的值,它会解决您的问题吗?