![](/img/trans.png)
[英]What happens to JOIN if no colums from said table are SELECT-ed?
[英]Select IDs even when there is no data in a 'JOIN'ed table
我想实现一些我认为很容易实现的目标,但是我无法解决这个问题。
我有两个表,A和B:
表A是定义所有项目的地方。
+----+--------------+
+ ID + other_things +
+----+--------------+
+ 1 + ~~~~~~~~~~~~ +
+ 2 + ~~~~~~~~~~~~ +
+ 3 + ~~~~~~~~~~~~ +
+----+--------------+
在表B中,存储了一些可选属性,但并非所有记录都在该表中。
+----+-------------+-------------+
+ ID + prop_type + prop_value +
+----+-------------+-------------+
+ 1 + prop1 + foo +
+----+-------------+-------------+
+ 1 + prop2 + toto +
+----+-------------+-------------+
+ 3 + prop2 + lorem +
+----+-------------+-------------+
当我查询这些表时,使用:
SELECT A.ID, B.prop_value FROM A FULL JOIN B ON A.ID = B.ID WHERE B.prop_type = 'prop2'
我懂了
ID prop_value
------------------------ -------------------------------------------------------
1 toto
3 lorem
但我想获得表A中的所有行,即使它们没有'prop2'值,例如
ID prop_value
------------------------ -------------------------------------------------------
1 toto
2
3 lorem
我如何调整查询以获取后者(我认为这与JOIN关键字有关,但是无论我阅读了多少教程,我都无法使其工作……)
非常感谢!
代替where
,使用and
:
SELECT A.ID, B.prop_value FROM A FULL JOIN B ON A.ID = B.ID and B.prop_type = 'prop2'
您只需要一个LEFT JOIN
。 关键是将WHERE
条件放在ON
子句中:
SELECT A.ID, B.prop_value
FROM A LEFT JOIN
B
ON A.ID = B.ID AND B.prop_type = 'prop2';
LEFT JOIN
将所有行保留在第一个表中,即使第二个表中没有匹配的行也是如此。 但是,第二个表中的列的值为NULL
,因此WHERE
子句将其过滤掉。
正如我在评论中指出的那样,MySQL不支持FULL OUTER JOIN
。 大多数数据库都可以,但是LEFT JOIN
仍然是您要执行的操作的合适LEFT JOIN
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.