我想做一些我认为相当容易的事情,但我无法绕过它。
我有两张桌子,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关键字有关,但无论我阅读了多少教程,我都无法使其工作......)
非常感谢!
答案 0 :(得分:0)
而不是where
,请使用and
:
SELECT A.ID, B.prop_value FROM A FULL JOIN B ON A.ID = B.ID and B.prop_type = 'prop2'
答案 1 :(得分:0)
您只需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
仍然是您想要做的适当的连接类型。