【问题标题】:Showing combined results for graph from two tables [duplicate]显示来自两个表的图表的组合结果[重复]
【发布时间】:2013-03-24 01:18:29
【问题描述】:

我有两张桌子:

投票

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。

【问题讨论】:

    标签: mysql sql


    【解决方案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

    【讨论】:

    • 这似乎是一个不错的方法,但 YEARMONTH 不是线性的。我需要区分 YEARMONTH 才能将数据用于图表
    • @Ted -- 我可能需要您详细说明 -- 根据您的上述数据,您想要的结果是什么?您不希望 t.Id 在您的结果中吗?也许删除然后添加 SUM 和/或 GROUP BY 可以完成您正在寻找的内容。
    • 最终我按照您的建议将 SUM 与 GROUP BY 一起使用,谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2017-07-05
      相关资源
      最近更新 更多