2016-07-28 44 views
0

我正在使用MySQL(5.7),我想加入2個表的基礎上一個ID和時間戳。MySQL JOIN不規則表

我的表是這樣的:

主表:

+--------+---------------------+-------------+ 
| UserId | Timestamp   | Information | 
+--------+---------------------+-------------+ 
|  5 | 2015-11-29 11:15:00 |   1 | 
|  5 | 2015-11-29 11:30:00 |   1 | 
|  5 | 2015-11-29 11:45:00 |   1 | 
|  5 | 2015-11-29 12:00:00 |   1 | 
|  5 | 2015-11-29 12:16:00 |   1 | 
+--------+---------------------+-------------+ 

次要表:

+--------+---------------------+-------------+ 
| UserId | Timestamp   | Information | 
+--------+---------------------+-------------+ 
|  5 | 2015-11-29 11:00:00 |   2 | 
|  5 | 2015-11-29 11:30:00 |   2 | 
|  5 | 2015-11-29 11:45:00 |   2 | 
|  5 | 2015-11-29 12:00:00 |   2 | 
|  5 | 2015-11-29 12:01:00 |   2 | 
|  5 | 2015-11-29 12:02:00 |   2 | 
|  5 | 2015-11-29 12:03:00 |   2 | 
|  5 | 2015-11-29 12:04:00 |   2 | 
|  5 | 2015-11-29 12:05:00 |   2 | 
|  5 | 2015-11-29 12:06:00 |   2 | 
|  5 | 2015-11-29 12:07:00 |   2 | 
|  5 | 2015-11-29 12:10:00 |   2 | 
|  5 | 2015-11-29 12:15:00 |   2 | 
|  5 | 2015-11-29 12:16:00 |   2 | 
+--------+---------------------+-------------+ 

我想要做的是返回所有記錄(從一級和二級表) 。如果記錄不存在於一個或另一個表中,它將返回null。

每個表中的記錄可以以不同的時間間隔進入。

,我使用的查詢是:

SELECT UserId, Timestamp, PrimaryInformation, SecondaryInformation 
FROM (
    SELECT 
     UserId, 
     Timestamp 
     Information AS PrimaryInformation, 
     null AS SecondaryInformation 
    FROM Primary 
    WHERE UserId = 5 AND Timestamp BETWEEN '2015-11-29 11:00:00' AND '2015-11-29 12:20:00' 

    UNION 

    SELECT 
     UserId, 
     Timestamp 
     null AS PrimaryInformation, 
     Information AS SecondaryInformation 
    FROM Secondary 
    WHERE UserId = 5 AND Timestamp BETWEEN '2015-11-29 11:00:00' AND '2015-11-29 12:20:00' 
) t 
GROUP BY UserId, Timestamp, PrimaryInformation, SecondaryInformation 

這將返回:

+--------+---------------------+---------------------+-----------------------+ 
| UserId | Timestamp   | Primary Information | Secondary Information | 
+--------+---------------------+---------------------+-----------------------+ 
|  5 | 2015-11-29 11:00:00 |    null |      2 | 
|  5 | 2015-11-29 11:15:00 |     1 |     null | 
|  5 | 2015-11-29 11:30:00 |     1 |     null | 
|  5 | 2015-11-29 11:30:00 |    null |      2 | 
|  5 | 2015-11-29 11:45:00 |     1 |     null | 
|  5 | 2015-11-29 11:45:00 |    null |      2 | 
|  5 | 2015-11-29 12:00:00 |     1 |     null | 
|  5 | 2015-11-29 12:00:00 |    null |      2 | 
|  5 | 2015-11-29 12:01:00 |    null |      2 | 
|  5 | 2015-11-29 12:02:00 |    null |      2 | 
|  5 | 2015-11-29 12:03:00 |    null |      2 | 
|  5 | 2015-11-29 12:04:00 |    null |      2 | 
|  5 | 2015-11-29 12:05:00 |    null |      2 | 
|  5 | 2015-11-29 12:06:00 |    null |      2 | 
|  5 | 2015-11-29 12:07:00 |    null |      2 | 
|  5 | 2015-11-29 12:10:00 |    null |      2 | 
|  5 | 2015-11-29 12:15:00 |    null |      2 | 
|  5 | 2015-11-29 12:16:00 |     1 |     null | 
|  5 | 2015-11-29 12:16:00 |    null |      2 | 
+--------+---------------------+---------------------+-----------------------+ 

這將返回重複的時間戳,而不是將它們合併。

,我需要它返回的路會是什麼樣子:

+--------+---------------------+---------------------+-----------------------+ 
| UserId | Timestamp   | PrimaryInformation | SecondaryInformation | 
+--------+---------------------+---------------------+-----------------------+ 
|  5 | 2015-11-29 11:00:00 |    null |      2 | 
|  5 | 2015-11-29 11:15:00 |     1 |     null | 
|  5 | 2015-11-29 11:30:00 |     1 |      2 | 
|  5 | 2015-11-29 11:45:00 |     1 |      2 | 
|  5 | 2015-11-29 12:00:00 |     1 |      2 | 
|  5 | 2015-11-29 12:01:00 |    null |      2 | 
|  5 | 2015-11-29 12:02:00 |    null |      2 | 
|  5 | 2015-11-29 12:03:00 |    null |      2 | 
|  5 | 2015-11-29 12:04:00 |    null |      2 | 
|  5 | 2015-11-29 12:05:00 |    null |      2 | 
|  5 | 2015-11-29 12:06:00 |    null |      2 | 
|  5 | 2015-11-29 12:07:00 |    null |      2 | 
|  5 | 2015-11-29 12:10:00 |    null |      2 | 
|  5 | 2015-11-29 12:15:00 |    null |      2 | 
|  5 | 2015-11-29 12:16:00 |     1 |      2 | 
+--------+---------------------+---------------------+-----------------------+ 

可能有人請點我在這個正確的方向。

謝謝:)

+0

我猜ü左需要加入的,而不是工會。輔助表是否覆蓋了主要的所有時間戳? – 1000111

+0

我玩過不同的JOIN,沒有運氣。 時間戳可以但不一定匹配在兩張表之間 –

回答

0

你讓他們都因爲在每個查詢行是不同的。

你可以運行相同的查詢,但沒有中小學信息,並且會給你不同的用戶/時間戳。

然後LEFT加入到UserId和TimeStamp上的Primary和Secondary。

像這樣的東西.....

SELECT UserId, Timestamp, P.PrimaryInformation, S.SecondaryInformation 
FROM (
    SELECT 
     UserId, 
     Timestamp 
    FROM Primary 
    WHERE UserId = 5 AND Timestamp BETWEEN '2015-11-29 11:00:00' AND '2015-11-29 12:20:00' 

    UNION 

    SELECT 
     UserId, 
     Timestamp 
    FROM Secondary 
    WHERE UserId = 5 AND Timestamp BETWEEN '2015-11-29 11:00:00' AND '2015-11-29 12:20:00' 
) t 
LEFT OUTER JOIN Primary P ON P.UserId = t.UserId and P.Timestamp = t.TimeStamp 
LEFT OUTER JOIN Secondary S ON S.UserId = t.UserId and S.Timestamp = t.TimeStamp 
GROUP BY UserId, Timestamp, PrimaryInformation, SecondaryInformation 

另外,我不認爲你需要的GROUP BY因爲你沒有做任何聚集在這裏。也許你得到它與ORDER BY混淆。 你也可以移動WHERE,並且只在JOINS之後有一次,但也許你已經完成了它,就像你有一個原因。

但無論如何,這是我認爲它應該更像.....

SELECT UserId, Timestamp, P.PrimaryInformation, S.SecondaryInformation 
FROM (
    SELECT 
     UserId, 
     Timestamp 
    FROM Primary 
    UNION 
    SELECT 
     UserId, 
     Timestamp 
    FROM Secondary 
) t 
LEFT OUTER JOIN Primary P ON P.UserId = t.UserId and P.Timestamp = t.TimeStamp 
LEFT OUTER JOIN Secondary S ON S.UserId = t.UserId and S.Timestamp = t.TimeStamp 
WHERE 
    t.UserId = 5 AND t.Timestamp BETWEEN '2015-11-29 11:00:00' AND '2015-11-29 12:20:00' 
ORDER BY 
    UserId, Timestamp, PrimaryInformation, SecondaryInformation 
+0

第二個塊看起來有點慢,但第一個塊完美運行。並不需要GROUP BY –

+0

我把它放在存儲過程中並調用它。 Proce將採用UserId,StartDate和EndDate。 遲早你會做一個錯字,然後輸入不匹配的參數。 很高興我幫了忙;) – AntDC