根据条件加入MySQL表?

时间:2013-04-02 19:17:24

标签: mysql join conditional-statements

问题:

我正在试图找出如何根据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语句,但我总是遇到语法错误。有人能指出我在正确的方向吗?提前致谢

2 个答案:

答案 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.field1b.field1存在并且相等的每一行
  • a LEFT JOIN b ON a.field1 = b.field1返回表a中的每一行,并返回表b中的每一行,其中a.field1 = b.field1null值为非匹配值表b
  • RIGHT JOIN类似于LEFT JOIN