2012-04-12 5 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 строк, 12000 в entity_contacts и несколько 1000 в объектах entity_contacts_telephones и entity_contacts_emails.

Я думал, что следующий будет работать, но это не делает:

LEFT JOIN entity_contacts_telephones 
    ON entity_contacts.id = entity_contacts_telephones.contactRef 
    AND COALESCE(entity_contacts_telephones.isPrimary = 1, 0) 
+0

Сколько может существовать сущность в таблице 'details'? Сколько вы хотите показать? –

+0

entity_details - это компании, я хочу показать только один контакт (предпочтительно основной) на строку. Надеюсь, у меня есть смысл. – imperium2335

ответ

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

+0

Действительно, мне нужен идентификатор этого контакта сверху, доступный для всего SQL-запроса, если вы знаете, что я имею в виду. – imperium2335

+0

У одного объекта может быть много контактов, контакт может принадлежать только одному объекту, но контакт может иметь много телефонных номеров и адресов электронной почты.Запрос занимает очень много времени (около 20 секунд), поэтому я предполагаю, что это займет еще больше времени, когда телефонные номера и электронные письма будут перенесены в микс :( – imperium2335

Смежные вопросы