Mysql sql联接-包括不存在的行
我有两个表,运行时存储运行时,临时存储温度。 我想获取所有运行时上所有项目的温度。 如果某个项目在运行时丢失,我希望它显示如下 表运行时Mysql sql联接-包括不存在的行,mysql,sql,Mysql,Sql,我有两个表,运行时存储运行时,临时存储温度。 我想获取所有运行时上所有项目的温度。 如果某个项目在运行时丢失,我希望它显示如下 表运行时 runtimeId | time 1 | 2014-04-02 12:00:00 2 | 2014-04-03 12:00:00 temps | itemId | runtimeId 10 | 1 | 1 20 | 2 | 1 11 | 1 | 2 表格
runtimeId | time
1 | 2014-04-02 12:00:00
2 | 2014-04-03 12:00:00
temps | itemId | runtimeId
10 | 1 | 1
20 | 2 | 1
11 | 1 | 2
表格温度
runtimeId | time
1 | 2014-04-02 12:00:00
2 | 2014-04-03 12:00:00
temps | itemId | runtimeId
10 | 1 | 1
20 | 2 | 1
11 | 1 | 2
想要的结果
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | 2 <--
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | 2左连接将显示temps表中的所有记录以及运行时表中的记录
select
*
from
runtimes rt
left join temps t on rt.runtimeId = t.runtimeId
您已经指出要查看与runtimeId
2匹配的itemId
2
但是,没有任何东西会以这种方式连接数据,因此用箭头指示的2将为空
你的结果是:
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | NULL
对于将显示itemId的笛卡尔乘积,无论它与另一个表的关系如何,请参见@wumpz answer左联接将显示temps表中的所有记录以及运行时表的记录
select
*
from
runtimes rt
left join temps t on rt.runtimeId = t.runtimeId
您已经指出要查看与runtimeId
2匹配的itemId
2
但是,没有任何东西会以这种方式连接数据,因此用箭头指示的2将为空
你的结果是:
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | NULL
对于将显示itemId的笛卡尔乘积,无论它与另一个表的关系如何,请参见@wumpz answer左联接将显示temps表中的所有记录以及运行时表的记录
select
*
from
runtimes rt
left join temps t on rt.runtimeId = t.runtimeId
您已经指出要查看与runtimeId
2匹配的itemId
2
但是,没有任何东西会以这种方式连接数据,因此用箭头指示的2将为空
你的结果是:
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | NULL
对于将显示itemId的笛卡尔乘积,无论它与另一个表的关系如何,请参见@wumpz answer左联接将显示temps表中的所有记录以及运行时表的记录
select
*
from
runtimes rt
left join temps t on rt.runtimeId = t.runtimeId
您已经指出要查看与runtimeId
2匹配的itemId
2
但是,没有任何东西会以这种方式连接数据,因此用箭头指示的2将为空
你的结果是:
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | NULL
对于将显示itemId的笛卡尔乘积,无论它与另一个表的关系如何,请参见@wumpz answer尝试此项
select r.runtimeid,r.time, t.temps, t.itemId from runtime r left join temps t
on r.runtimeid=t.runtimeid
试试这个
select r.runtimeid,r.time, t.temps, t.itemId from runtime r left join temps t
on r.runtimeid=t.runtimeid
试试这个
select r.runtimeid,r.time, t.temps, t.itemId from runtime r left join temps t
on r.runtimeid=t.runtimeid
试试这个
select r.runtimeid,r.time, t.temps, t.itemId from runtime r left join temps t
on r.runtimeid=t.runtimeid
这是您的请求的解决方案:
select
r.runtimeId,r.time,
(select temps from temps where runtimeId=r.runtimeId and itemId=data.itemId) as temps,
data.itemId
from
runtimes r,
(select distinct itemId from temps) data
order by r.runtimeid, data.itemid
它会给你想要的结果
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | 2这是您请求的解决方案:
select
r.runtimeId,r.time,
(select temps from temps where runtimeId=r.runtimeId and itemId=data.itemId) as temps,
data.itemId
from
runtimes r,
(select distinct itemId from temps) data
order by r.runtimeid, data.itemid
它会给你想要的结果
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | 2这是您请求的解决方案:
select
r.runtimeId,r.time,
(select temps from temps where runtimeId=r.runtimeId and itemId=data.itemId) as temps,
data.itemId
from
runtimes r,
(select distinct itemId from temps) data
order by r.runtimeid, data.itemid
它会给你想要的结果
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | 2这是您请求的解决方案:
select
r.runtimeId,r.time,
(select temps from temps where runtimeId=r.runtimeId and itemId=data.itemId) as temps,
data.itemId
from
runtimes r,
(select distinct itemId from temps) data
order by r.runtimeid, data.itemid
它会给你想要的结果
runtimeId | time | temps | itemId
1 | 2014-04-02 12:00:00 | 10 | 1
1 | 2014-04-02 12:00:00 | 20 | 2
2 | 2014-04-03 12:00:00 | 11 | 1
2 | 2014-04-02 12:00:00 | NULL | 2如果您的表“temps”不包含itemid=2和runtimeId=2的行,则无法通过联接获取该行。您的语句:如果运行时表中缺少一个项。而且,您的示例显示了TEMP中遗漏的一些内容。您问的是正确的问题吗?如果表“temps”不包含itemid=2和runtimeId=2的行,则无法通过联接获取该行。您的语句:如果运行时表中缺少一个项。而且,您的示例显示了TEMP中遗漏的一些内容。您问的是正确的问题吗?如果表“temps”不包含itemid=2和runtimeId=2的行,则无法通过联接获取该行。您的语句:如果运行时表中缺少一个项。而且,您的示例显示了TEMP中遗漏的一些内容。您问的是正确的问题吗?如果表“temps”不包含itemid=2和runtimeId=2的行,则无法通过联接获取该行。您的语句:如果运行时表中缺少一个项。而且,您的示例显示了TEMP中遗漏的一些内容。你问的是正确的问题吗?根据数据,它不会工作,因为在“temps”中没有itemid=2和runtimeId=2的行。根据数据,它不会工作,因为在“temps”中没有itemid=2和runtimeId=2的行。根据数据,它不会工作,因为在“temps”中没有行根据数据,如果itemid=2和runtimeId=2,它将不起作用,因为在itemid=2和runtimeId=2的“temps”中没有行。这是强制解决问题的一种方法。不能说我喜欢这个结果。select中的子select是不可维护的,您刚刚在这里生成了一个笛卡尔积,因此它无法很好地扩展。但是,您确实得到了正确的答案:)+1您是对的,但是在OP中要求使用笛卡尔积:“对于所有运行时上的所有项”。好吧,这是强制解决问题的一种方法。不能说我喜欢这个结果。select中的子select是不可维护的,您刚刚在这里生成了一个笛卡尔积,因此它无法很好地扩展。但是,你确实得到了正确的答案:)+1你是对的,但是笛卡尔积是在OP中要求的:“fo