在MySQL中使用条件连接加入三个表

时间:2016-10-06 16:14:40

标签: mysql join conditional

我正在尝试修改现有查询以使用条件JOIN。

我有三个表:invoicescompaniesclients

应用程序逻辑是这样的:首先是为每个订单创建一个数量清单。然后,我为该数量清单创建发票。有时,发出订单的客户与收到账单的客户不同(例如:来自公司A +的客户A正在下订单,但来自公司B +的客户B正在为该订单收费)。对于此方案,我有invoice_as_company_idinvoice_as_client_id列。

现在我有一个获取所有发票的查询,它看起来像这样:

SELECT i.*, co.name AS company, cl.name AS client
FROM invoices i
LEFT JOIN companies co ON i.invoice_company_id = co.company_id
LEFT JOIN clients cl ON i.invoice_client_id = cl.client_id
ORDER BY i.invoice_date DESC
LIMIT 10

所以我想像这样修改这个查询:

  • 如果invoice_as_company_id为null,则使用 公司表中的invoice_company_id字段加入
  • 如果invoice_as_client_id为空,则使用invoice_client_id字段 在clients表中加入

数据库表格如下。

发票

+-----------------------+--------------+
| invoice_id            | int(10)      |
| invoice_date          | date         |
| invoice_number        | int(11)      |
| invoice_amount        | decimal(5,2) |
| invoice_company_id    | int(11)      |
| invoice_client_id     | int(11)      |
| invoice_as_company_id | int(11)      |
| invoice_as_client_id  | int(11)      |
| date_added            | int(11)      |
+-----------------------+--------------+

公司

+--------------+--------------+
| company_id   | int(10)      |
| company_name | varchar(255) |
| date_added   | int(11)      |
+--------------+--------------+

客户

+-------------+--------------+
| client_id   | int(10)      |
| client_name | varchar(255) |
| date_added  | int(11)      |
+-------------+--------------+

1 个答案:

答案 0 :(得分:1)

LEFT JOIN companies co ON co.company_id=IFNULL(i.invoice_company_as_id, i.invoice_company_id)

如果您有更具体的测试用例:

LEFT JOIN companies co ON co.company_id=IF(i.invoice_company_as_id IS NULL OR i.invoice_company_as_id = 0, i.invoice_company_as_id, i.invoice_company_id)

第二种情况也是如此。演出可能会因重磅表而消失......