【问题标题】:Join three tables using conditional joins in MySQL在 MySQL 中使用条件连接连接三个表
【发布时间】:2017-02-15 11:48:24
【问题描述】:

我正在尝试修改现有查询以使用条件 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 为空,则使用 invoice_company_id 公司表中的字段连接
  • 如果invoice_as_client_id 为空,则使用invoice_client_id 字段 在客户表中加入

数据库表如下。

发票

+-----------------------+--------------+
| 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)      |
+-------------+--------------+

【问题讨论】:

    标签: mysql join conditional


    【解决方案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)

    对于您的第二种情况也是如此。对于沉重的桌子,表演可能会消失......

    【讨论】:

    • 谢谢,异形。看起来很合身。但是浏览invoices表我发现有一些记录invoice_as_company_idinvoice_as_client_id不是null,而是0。我可以用什么来做这些?
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多