当Table2没有与Table1相关的记录时,MySQL加入2个表

时间:2015-05-07 21:42:09

标签: mysql sql-server join mysqli

我有两个表,称之为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中字段“Time”的总和,其中主键和外键匹配。

如果没有外键,我仍然希望显示Table1中的记录,“Time”字段应该只显示0。

2 个答案:

答案 0 :(得分:0)

首先,听起来你需要使用聚合,因为你试图对给定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

答案 1 :(得分:0)

您写入的查询将不会执行,因为如果存在不在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)中的每个记录。如果您没有想要在结果中使用null,如果没有匹配,那么您可以添加coalesce函数将任何空值转换为零。