【发布时间】:2020-12-21 15:28:28
【问题描述】:
情景
三个表:
- 订单
- 客户
- delivery_addresses
关系
- orders.customerId 指向 customers.id
- orders.customerId 指向 delivery_addresses.customerId
目标
是从 orders 中选择满足 customers 或 delivery_addresses 列条件的任何商品.在更实际的意义上:我想搜索存储在 either customers 或 delivery_addresses 中的具有特定名称(或邮政编码或其他)的客户订单强>。
我的尝试
我不太擅长连接及其背后的逻辑,但经过一些扎实的研究后,我想出了这个:
SELECT orders.* FROM orders INNER JOIN customers ON orders.customerId = customers.id INNER JOIN delivery_addresses ON orders.customerId = delivery_addresses.customerId WHERE ((customers.first_name LIKE "%max%") OR (delivery_addresses.first_name LIKE "%max%"))
但是,这不起作用。只有在 delivery_addresses 中有相应条目时,我才会得到结果,但如果 customers 中只有一个条目,则不会。
因此,如果我像这样缩短查询:
SELECT orders.* FROM orders INNER JOIN customers ON orders.customerId = customers.id WHERE (customers.first_name LIKE "%max%")
我确实得到了正确的结果。
结论
我确信我错过了一个关于我对连接如何工作的理解的关键点。但我不知道它是什么。
【问题讨论】:
-
您可以使用
Left/Right加入。Innerjoin 返回两个表上都存在的数据。 -
感谢您的提示!但是由于我在语句中有两个连接,在给定的情况下应该是哪个?或者也许是一个完整的答案?
-
你应该把它们都改成
LEFT JOIN。像这样,您将返回来自customer和delivery_addresses的所有订单和相关数据。这是第一个集合,之后,使用“WHERE”子句,您可以过滤符合您条件的退货订单的结果。 -
知道了——谢谢!
标签: mysql join inner-join