关于mysql:显示来自两个表的图形的组合结果

Showing combined results for graph from two tables

本问题已经有最佳答案,请猛点这里访问。

我有两张桌子:

选票

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

讲座

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

假设一个ID在一个给定的年份月份中没有每个表的行(讲座或投票),我需要列出结果,以便在图表中显示它们。

如果一年一个月的结果在另一张表上丢失,我需要显示零。

结果应该是这样的:

1
2
3
4
5
ID |  YEARMONTH | VOTES | LECTURES
==================================
1  | 201101     | 23    | 1
1  | 201102     | 12    | 0
1  | 201103     | 12    | 0

但是,当然,如果没有投票,而讲座没有缺席,我需要在那里显示0。


一个选项是使用所有可能的id/yearmonth组合创建子查询,然后在其他表上创建LEFT JOIN。如果对应记录为空,则使用COALESCE返回0:

1
2
3
4
5
6
7
8
9
10
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小提琴演示


您通常会使用一个完整的外部连接,但MySQL不支持它们。

但是,您可以用一个联合来模拟它,正如这个问题的公认答案所示。