mysql - 从多个表加入不在 MySQL 中返回所需的数据

标签 mysql join

我的数据库中有三个表(contractspartnerscustomers),其中一个契约(Contract)可用于客户和合作伙伴。

我只将契约(Contract)数据保存在contracts 表和customers 表中,partners 表包含一个名为contract_id 的字段> 这是 contracts id 字段的外键。

不,我想选择契约(Contract)并将它们显示在列表中,但如果契约(Contract)同时用于客户和合作伙伴,我希望我的列表同时显示它们,但我无法让它工作。

我的查询是:

SELECT c.*, p.id AS partner_id, p.name AS partner_name, 
       cu.id AS customer_id, cu.name AS customer_name
FROM contracts AS c 
LEFT JOIN partners AS p ON c.id = p.contract_id
LEFT JOIN customers AS cu ON c.id = cu.contract_id

样本: contract表的记录如下:

    id  |   title   |   contract_start  |   contract_end
-------------------------------------------------------------
    1   |   Test    |   2012-10-02      |   2013-10-02
    2   |   Test2   |   2012-09-27      |   2013-09-27

customers 表的记录如下:

    id  |   code    |   name                |   contract_id
-------------------------------------------------------------
    1   |   123456  |   Customer1           |   1
    2   |   654321  |   Dummy Co. LTD.      |   2

partners表的记录如下:

    id  |   code    |   name                |   contract_id
-------------------------------------------------------------
    1   |   789456  |   Partner1            |   1

不,我想要一个包含 3 条记录的列表,每条记录显示一份契约(Contract)(考虑到其中一条是重复的),每条记录显示合作伙伴或客户名称和 ID。如果契约(Contract)涉及客户,则合作伙伴字段应为 null,反之亦然。

最佳答案

你说:

No I want to select contracts and show them in a list, but if a contract has been used for a customer and a partner simultaneously, I want my list to show both of them

您可能需要分别连接两个表并使用UNION:

SELECT c.*, 
       p.id AS partner_id, p.name AS partner_name, 
       NULL AS customer_id, NULL AS customer_name
FROM contracts AS c 
INNER JOIN partners AS p ON c.id = p.contract_id

UNION ALL

SELECT c.*, 
       NULL AS partner_id, NULL AS partner_name, 
       cu.id AS customer_id, cu.name AS customer_name
FROM contracts AS c 
INNER JOIN customers AS cu ON c.id = cu.contract_id

UNION ALL

SELECT c.*, 
       NULL, NULL,
       NULL, NULL 
FROM contracts AS c 
WHERE NOT EXISTS ( SELECT *  
                   FROM partners AS p
                   WHERE c.id = p.contract_id
                 )
  AND NOT EXISTS ( SELECT *
                   FROM customers AS cu 
                   WHERE c.id = cu.contract_id 
                 ) ;

(另一种不同输出设置的方式)
如果您愿意,可以将最后四列合并为两列,添加一列以区分合作伙伴和客户:

SELECT c.*, 
       p.id AS partner_customer_id, p.name AS partner_customer_name, 'P' AS type 
FROM contracts AS c 
INNER JOIN partners AS p ON c.id = p.contract_id

UNION ALL

SELECT c.*, 
       cu.id , cu.name, 'C'
FROM contracts AS c 
INNER JOIN customers AS cu ON c.id = cu.contract_id ;

关于mysql - 从多个表加入不在 MySQL 中返回所需的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13769107/

相关文章:

mysql - 如何选择下个月的数据

mysql 存储过程输出多列

mysql - 如何对这三个表进行适当的 OUTER JOIN?我不断得到最后一栏中的所有结果,加起来

使用 JOINS 和 GROUP BY 进行 MySQL 查询

php - mysql_query 更新不工作虽然我没有收到任何 mysql 错误

mysql - 如何在同一查询中使用外键计算表中的行数?

mysql - 如何授予对mysql的root访问权限?

sql - 如何加快三个大表的 INNER JOIN 中分组的 COUNT 个值的速度?

MySQL 查询选择全部,仅找到两个选项之一

mysql 关联表到多个表