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