1

问题:

我试图弄清楚如何根据 SQL 语句中的条件连接表。我花了一个小时搜索 Google、SO、各种网站和 MYSQL 手册,但我就是找不到我想做的正确语法。

我无法发布我正在尝试使用的确切查询,但为了简单起见,我将发布一个简化版本。

设想:

假设我有三个表,a= 人表,b= 地址表和c= 车表。

Tableb将始终连接到 table a,因为一个人总是住在一个地址,但只有当“car_id”字段中的值大于 0c时才应该连接到table,因为有车是可选的。a

查询:

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 语句,但我总是遇到语法错误。有人可以在这里指出我正确的方向吗?提前致谢

4

2 回答 2

3

您应该使用左外连接将 c 与 a 连接起来。

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
于 2013-04-02T19:21:06.177 回答
3

使用LEFT JOIN而不是INNER JOIN放在桌子上c

单边连接适用于这种情况。

简要说明。

  • a INNER JOIN b ON a.field1 = b.field1返回两者a.field1b.field1存在且相等的每一行
  • a LEFT JOIN b ON a.field1 = b.field1返回 table 中的每一行,a并返回 table 中的每一行,以及tableb上不匹配值的值。a.field1 = b.field1nullb
  • RIGHT JOIN类似于LEFT JOIN
于 2013-04-02T19:26:45.940 回答