【问题标题】:Join 2 Tables When Table2 Doesn't Have Records Relating to Table1当 Table2 没有与 Table1 相关的记录时 MySQL 加入 2 个表
【发布时间】:2015-07-18 16:22:06
【问题描述】:

我有两个表,分别称为 Table1 和 Table2。 Table1 的主键为“ID”,Table2 的外键字段为“Table1ID”。

我可以运行此连接,但只有在两个表中都有匹配的主键和外键值时,它才会按照我想要的方式工作。

SELECT a.*, sum(b.Time) AS Time FROM Table1 AS a JOIN Table2 AS b ON a.ID = b.Table1ID

如您所见,我正在尝试从 Table1 中提取所有字段以及 Table2 中主键和外键匹配的字段“时间”的总和。

如果没有外键,我仍然希望显示 Table1 中的记录,“时间”字段应该简单地显示一个 0。

【问题讨论】:

标签: mysql sql-server join mysqli


【解决方案1】:

首先听起来您需要使用聚合,因为您正在尝试对给定 ID 的时间求和。为此使用group by 并根据需要定义字段(vs *)。

其次,您需要使用outer join 来返回那些没有匹配项的记录。

最后,您可以使用coalescenull 和转换为0:

SELECT a.id, 
    coalesce(sum(b.Time),0) AS Time 
FROM Table1 AS a 
    LEFT JOIN Table2 AS b ON a.ID = b.Table1ID
GROUP BY a.id

【讨论】:

    【解决方案2】:

    如果存在不在 group by 子句中的其他字段,则您的查询将不会执行,因为您不允许在 select 子句中执行聚合函数。所以有几个选择:

    将 Table1 中的每个字段都包含在您的 select 和 group by 子句中,例如:

    SELECT a.ID, a.Attribute1, a.Attribute2, a.Attribute3...
        , coalesce(sum(b.Time), 0) AS Time 
    FROM Table1 AS a 
    LEFT JOIN Table2 AS b 
    ON a.ID = b.Table1ID
    Group by a.ID, a.Attribute1, a.Attribute2, a.Attribute3
    

    或者您可以创建一个子查询,在 Table2 上进行聚合,然后与 Table1 连接。

    SELECT a.*
        , coalesce(b.Time, 0) AS Time 
    FROM Table1 AS a 
    LEFT JOIN 
        (
        SELECT Table1ID, SUM(Time) Time
        FROM Table2
        GROUP BY Table1ID
        ) AS b 
    ON a.ID = b.Table1ID
    

    请注意,您需要一个 LEFT JOIN,这意味着无论第二个表中是否存在匹配记录,都会返回第一个表(Table1)中的每条记录。如果您不希望结果中出现不匹配的空值,则添加合并函数以将任何空值变为零。

    【讨论】:

      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多