2012-04-12 57 views
0

我想輸出聯繫人名稱列表與他們的電話號碼和電子郵件地址給定的公司。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

回答

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

你可能需要一個連接 - 在[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

相關問題