0

我正在尝试输出给定公司的联系人姓名列表以及他们的电话号码和电子邮件地址。

我面临的问题是让它根据以下标准输出联系人:

联系人可能有也可能没有姓名、电子邮件或电话,但他们必须至少有其中一个才能出现在结果中。

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

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

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

我尝试了以下方法来获取联系人姓名,但没有成功:

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

1 回答 1

0

这可能有效(不确定主要是因为不清楚每个表中每个实体可以有多少行):

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 = ?

您可能需要一个 join -[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)将有助于提高性能。

于 2012-04-12T07:26:40.610 回答