【问题标题】:Join MySQL tables based on condition?根据条件加入 MySQL 表?
【发布时间】:2013-03-24 05:47:51
【问题描述】:

问题:

我试图弄清楚如何根据 SQL 语句中的条件连接表。我花了一个小时搜索 Google、SO、各种网站和 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 语句,但我总是遇到语法错误。有人可以在这里指出我正确的方向吗?提前致谢

【问题讨论】:

标签: mysql join conditional-statements


【解决方案1】:

在表c 上使用LEFT JOIN 而不是INNER JOIN

单方面加入了这个场景的工作。

简要说明。

  • 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

【讨论】:

  • +1 进行解释。我明白现在发生了什么,谢谢:)
【解决方案2】:

你应该使用左外连接来连接 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

【讨论】:

  • 完美运行!我不敢相信我在这上面浪费了多少时间。我将不得不进一步阅读连接,因为我显然还没有完全理解它们。
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多