2013-04-02 45 views
3

我有兩個表:顯示爲圖形組合結果從兩個表

票數

ID | YEARMONTH | VOTES 
======================== 
1 | 201101  | 23 
1 | 201102  | 12 
1 | 201103  | 12 
2 | 201101  | 15 
3 | 201102  | 1 
4 | 201102  | 17 

講座

ID | YEARMONTH | LECTURES 
======================== 
1 | 201101  | 1 
2 | 201101  | 2 
3 | 201102  | 5 

假設一個ID可以爲每個沒有行在給定的一個月(表演或投票)中,我需要列出結果,以便我可以向他們展示在圖中。

如果在一個月內其他表上缺少結果,我需要顯示零。

這樣的結果應該是這樣的:

ID | YEARMONTH | VOTES | LECTURES 
================================== 
1 | 201101  | 23 | 1 
1 | 201102  | 12 | 0 
1 | 201103  | 12 | 0 

不過,當然,如果票數失蹤,其中講座都不缺,我需要顯示0那裏。

回答

1

一種選擇是創建一個包含所有可能的ID/YearMonth組合的子查詢,然後在其他表上使用LEFT JOIN。然後用COALESCE返回0,如果相應的記錄是空的:

SELECT t.ID, t.YearMonth, COALESCE(V.Votes,0) Votes, COALESCE(L.Lectures,0) Lectures 
FROM (
    SELECT DISTINCT ID, YearMonth 
    FROM Votes 
    UNION 
    SELECT DISTINCT ID, YearMonth 
    FROM Lectures 
    ) t 
    LEFT JOIN Votes v on t.ID = v.ID AND t.YearMonth = v.YearMonth 
    LEFT JOIN Lectures l on t.ID = l.ID AND t.YearMonth = l.YearMonth 

SQL Fiddle Demo

+0

這似乎是一個好辦法,但YEARMONTH不是線性的。我需要YEARMONTH才能使用圖表中的數據 – Ted

+0

@Ted - 我可能需要您從上述數據中詳細闡述您期望的結果是什麼?你不想在結果中使用t.Id嗎?也許刪除,然後添加一個SUM和/或GROUP BY可以完成你正在尋找的東西。 – sgeddes

+0

最後我使用了與GROUP BY一樣的SUM,謝謝! – Ted

1

您通常會爲此使用FULL OUTER JOIN,但MySQL不支持它們。

但是,您可以使用UNION來模擬它,如this question的接受答案所示。

相關問題