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

但是,当然,如果没有 LECTURES 的地方没有 VOTES,我需要在那里显示 0。

4

2 回答 2

1

您通常会为此使用 FULL OUTER JOIN,但 MySQL 不支持它们。

但是,您可以使用 UNION 来模拟它,正如该问题的公认答案所示。

于 2013-04-02T16:31:00.873 回答
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 小提琴演示

于 2013-04-02T16:32:41.030 回答