我的数据库中有三个表(contracts
、partners
和customers
),其中一个契约(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/