问题:
我正在试图找出如何根据SQL语句中的条件连接表。我花了一个小时搜索谷歌,搜索引擎优化,各种网站和MYSQL手册,但我找不到我想要做的正确语法。
我无法发布我正在努力工作的确切查询,但出于简单原因,我会发布一个简化版本。
情境:
假设我有三个表,a
=人员表,b
=地址表,c
=汽车表。
表b
将始终加入表a
,因为一个人总是住在一个地址,但表c
只应加入a
,如果值在'car_id'字段中大于0,因为拥有一辆汽车是可选的。
查询:
SELECT a.firstname, a.lastname, a.gender, a.address_id, b.address_firstline, b_address_secondline, b.postcode, c.car_manufacturer, c.car_model
FROM a
INNER JOIN b ON b.id = a.address_id
INNER JOIN c ON c.id = a.car_id AND a.car_id > 0
WHERE a.id = 1
上面的查询对于id为1的人来说运行正常,因为他拥有一辆汽车。但是,如果为id为2的人运行查询,则查询将返回0行,因为她没有汽车。
如何使第二个JOIN可选?我尝试过使用IF ELSE语句,但我总是遇到语法错误。有人能指出我在正确的方向吗?提前致谢
答案 0 :(得分:2)
你应该使用左外连接来加入c。
SELECT a.firstname, a.lastname, a.gender, a.address_id, b.address_firstline, b_address_secondline, b.postcode, c.car_manufacturer, c.car_model
FROM a
INNER JOIN b ON b.id = a.address_id
LEFT OUTER JOIN c ON c.id = a.car_id AND a.car_id > 0
WHERE a.id = 1
答案 1 :(得分:2)
在表LEFT JOIN
上使用INNER JOIN
代替c
。
Unilateral 加入了这种情况。
简要说明。
a INNER JOIN b ON a.field1 = b.field1
返回a.field1
和b.field1
存在并且相等的每一行a LEFT JOIN b ON a.field1 = b.field1
返回表a
中的每一行,并返回表b
中的每一行,其中a.field1 = b.field1
和null
值为非匹配值表b
。RIGHT JOIN
类似于LEFT JOIN