我正在尝试输出给定公司的联系人姓名列表以及他们的电话号码和电子邮件地址。
我面临的问题是让它根据以下标准输出联系人:
联系人可能有也可能没有姓名、电子邮件或电话,但他们必须至少有其中一个才能出现在结果中。
每个公司可以有多个联系人。
每个联系人可以有多个电子邮件地址和/或电话号码。
联系人上有一个主要标志,因此如果有多个联系人并且其中一个是主要的,它应该选择那个而不是另一个非主要的。
我尝试了以下方法来获取联系人姓名,但没有成功:
SELECT entity_details.name,
COALESCE(
(SELECT entity_contacts.name FROM entity_contacts
WHERE entity_contacts.entityRef = entity_details.id
ORDER BY entity_contacts.isPrimary = 1),
(SELECT entity_contacts.name FROM entity_contacts
WHERE entity_contacts.entityRef = entity_details.id)
)
AS contact
FROM entity_details
WHERE entity_details.ownerRef = ?
这是我能做到的最接近的事情,但我不确定它是否正确,并且它不会优先考虑主要联系人,它只是选择 entityRef 上的任何和组来删除重复项:
SELECT
entity_details.name, entity_contacts.name AS contact,
entity_contacts_telephones.tel, entity_contacts_emails.email
FROM entity_details
LEFT JOIN entity_contacts ON entity_details.id = entity_contacts.entityRef
LEFT JOIN entity_contacts_telephones ON entity_contacts.id = entity_contacts_telephones.contactRef
LEFT JOIN entity_contacts_emails ON entity_contacts.id = entity_contacts_emails.contactRef
WHERE entity_details.ownerRef = ?
GROUP BY entity_contacts.entityRef
LIMIT ?, ?
所有表格都是 Innobd,我正在使用的表格在上面的编辑中。所有参考文献等都有关于哪里的索引。
在 entity_details 中大约有 13000 行,在 entity_contacts 中大约有 12000 行,在 entity_contacts_telephones 和 entity_contacts_emails 中大约有 1000 行。
我认为以下方法会起作用,但它不起作用:
LEFT JOIN entity_contacts_telephones
ON entity_contacts.id = entity_contacts_telephones.contactRef
AND COALESCE(entity_contacts_telephones.isPrimary = 1, 0)