2017-07-10 17 views
1

2つのMySQLテーブルがあります。これは、派生テーブルとして参加しアクセスする必要があります。いくつかのダミー行の存在しないレコードの場合、MySQLはnullを返します。

Basicの例:

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; 

このクエリは、次の表を返します。 Test.TableOneでは(例として)15分ごとです。

Test.TableTwoのタイムスタンプは(例として)10分ごとです。

私ができることをしたいのは、のすべてのタイムスタンプと、対応するDATETIMEの '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) 

は運でこれを達成するために結合します。

ご協力いただければ幸いです。ありがとう。

+0

あなたはタイムスタンプとの両方の値を持つ2つのcolumsで1行のみを持っていた場合tableoneとtabletwoそれはあなたの問題を解決するだろうか? – carla

答えて

0

タイムスタンプごとに1つの行を使用し、各テーブルの値を持つ2つの列を使用すると、クエリが小さくなる可能性があります。

あなたは本当にあなたが尋ねただけのような出力が必要な場合は、次の2つの完全外部をエミュレートする必要が参加し、それらを団結:

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 
関連する問題