MySQL复杂的联系人表

问题描述:

我想输出联系人名称列表与他们的电话号码和电子邮件地址给定的公司。MySQL复杂的联系人表

我面对的是它让输出基于以下条件的接触问题:

联系人可能会或可能不会有姓名,电子邮件或电话,但他们必须有至少其中之一出现在结果中。

每个公司可以有多个联系人。

每个联系人可能有多个电子邮件地址和/或电话号码。

联系人上有一个主标志,因此如果有多个联系人并且其中一个联系人是主要联系人,则应选择该联系人而不是其他非主要联系人。

我已经尝试了获取联系人的名字,但没有成功如下:

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

实体在'details'表中可以有多少个?你想展示多少? – 2012-04-12 07:30:57

+0

entity_details是公司,我只想显示每行一个联系人(最好是主要联系人)。希望我有道理。 – imperium2335 2012-04-12 07:49:53

这可能工作(主要不是确定,因为目前还不清楚,你可以有多少行每个实体在每个表):

SELECT 
    entity_details.name, 
    (SELECT entity_contacts.name 
     FROM entity_contacts 
     WHERE entity_contacts.entityRef = entity_details.id 
     ORDER BY entity_contacts.isPrimary DESC 
     LIMIT 1 
    ) AS contact 
FROM entity_details 
WHERE entity_details.ownerRef = ? 

你可能需要一个连接 - 在[greatest-n-per-group]类型:

SELECT 
    d.name, 
    ... 
    c.whatever 
    ... 
FROM 
    entity_details AS d 
    JOIN 
    entity_contacts AS c 
     ON c.PK =     --- the PRIMARY KEY of contacts table 
      (SELECT cc.PK 
      FROM entity_contacts AS cc 
      WHERE cc.entityRef = d.id 
      ORDER BY cc.isPrimary DESC 
      LIMIT 1 
      ) 
WHERE d.ownerRef = ? 

(entityRef, isPrimary)上的索引将有助于提高性能。

+0

谢谢,我已经尝试过,但无法弄清楚现在如何将其他两个表格(电话和电子邮件)加入其中。我无法弄清楚如何将它们链接到上面查询中的选定联系人?那些其他表通过名为contactRef的列连接到联系人。 – imperium2335 2012-04-12 07:30:28

+0

真的,如果你知道我的意思,我需要从上面的联系人的ID到整个SQL查询。 – imperium2335 2012-04-12 07:31:09

+0

一个实体可以有很多联系人,联系人只能属于一个实体,但联系人可以有很多电话号码和电子邮件地址。该查询需要很长时间才能运行(大约20秒),所以我想如果将电话​​号码和电子邮件混合使用,则需要更长的时间: – imperium2335 2012-04-12 07:47:19