MySQL的。选择加入值不存在的连接

时间:2016-03-01 17:03:00

标签: mysql

我有2个表:element和element_property。

我想选择其中一个属性不存在的所有元素。这意味着此查询不返回任何内容:

select * from element_property where PROPERTY_ID = 176 AND ELEMENT_ID = 123

但是有一行:

select * from element where ID = 123

所以,我想找到PROPERTY_ID = 176不存在的所有元素。

此变体不返回任何内容:

select t1.ID, t2.* from element t1
left JOIN element_property t2 ON t1.ID = t2.ELEMENT_ID
where t2.PROPERTY_ID = 176 and t2.ID IS NULL

1 个答案:

答案 0 :(得分:1)

您遇到的问题是在连接后发生了t2.property_ID = 176的where子句。由于elment ID 123 doens没有属性176,因此它被排除在where子句之外。

通过将其移动到连接,您可以告诉引擎首先将所有elment_properties过滤为176,然后将其连接到元素。然后删除所有具有该元素的记录(其中T2.ID为空)

你的方法否定左连接基本上使它成为一个内连接。

因此,如果您将选择更新为此,则应该有效:

select t1.ID, t2.* 
from element t1 
left JOIN element_property t2 
  ON t1.ID = t2.ELEMENT_ID 
 and t2.PROPERTY_ID = 176 
where t2.Element_ID IS NULL

让我们关注你的where子句。元素123不存在176的Property_ID。因此,通过说t2.property_ID = 176,你排除了元素123.

通过将限制移动到JOIN,您的结果集看起来就像没有where ...

Element Property ID
123     NULL     NULL 
003     NULL     NULL
001     176      1
002     176      2

因此,在本例中,where属性为null,您将获得记录123和003。

但如果你说where property = 176且ID为null ......你就没有记录回来了。