mysql左连接返回记录不存在于日期范围内

时间:2017-10-02 20:09:35

标签: mysql join

我需要查找表1中未从table2引用的特定日期范围的记录 - 也就是T1中某些日期范围内没有引用的T1元素集。

在我看来,这是两个子查询的左连接的组合。

逻辑

查询1:AllT1Records:返回T1的所有记录

查询2:AllT1RefsInDateRange:特定日期范围内T2对T2的所有引用

查询3:从AllT1RefsInDateRange中不存在的AllT1Records返回那些记录

这让我成为了那里的一部分,但是返回T1中的所有记录而T2中没有引用:

select T1.name, T2.rackName, T2.allocationStart
From T1

LEFT JOIN
T2 on T1.name = T2.rackName

where T2.allocationStart is null

这会获取日期范围的所有T1引用:

select T1.name, T2.rackName, T2.allocationStart from T2, T1

where T2.allocationStart > date_sub(curdate(),INTERVAL 60 day)
and T1.name = T2.rackName

group by T1.name 

我需要的是来自T1的所有记录,在T2中没有针对特定日期范围的引用。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

为什么要按t1.name分组?如果同一个t1.name有多个记录,那么我建议将日期范围的t1引用放在cte中,然后使用它来执行左连接到t2。

答案 1 :(得分:0)

  

在我看来,这是两个子查询的左连接的组合。

我不明白你为什么这么说。您提供的第一个“子查询”返回表T1的所有内容,因此它等同于T1本身。现在,虽然可以形成T2中某些记录的内联视图并形成一个左连接,但这样做会有些过分。我,我会这样做:

select T1.*
from T1
  left join T2
    on T1.name = T2.rackName
      and T2.allocationStart > date_sub(curdate(),INTERVAL 60 day)
where T2.rackName is null

这建立在你提出的第二个查询的基础上,假设T2.allocationStart上的标准具有你想要的效果。请注意,我已将该标准合并到连接条件中,这对于实现所需的效果非常重要。然后where子句选择那些表示没有相应T2行的T1行的行(根据连接条件);我们可以确定没有选择其他行,因为如果T2.rackName为空,则它不能是T2.rackName = T1.name,即使T1.name也为空。