2015-05-15 2 views
0

У меня есть запрос MySQL (я использую phpmyadmin), и я знаю, что таблицу не следует создавать таким образом, но у меня должна быть только одна таблица для проекта, над которым я работал. Это мой запрос sql.MySql Таблица, как получить все контакты?

CREATE VIEW v_sugarcrm AS 
SELECT AC.id, A.id AS account_id, A.name, A.description, A.industry, A.phone_fax, A.phone_office, A.shipping_address_street, A.shipping_address_city, A.shipping_address_state, A.shipping_address_postalcode, A.shipping_address_country, C.id AS contact_id, C.first_name, SUBSTRING_INDEX(C.last_name, ' ', -1) as last_name,concat(c.first_name, ' ', c.last_name) as full_name, SUBSTRING_INDEX(SUBSTRING_INDEX(concat(c.first_name, ' ', c.last_name), ' ', 2), ' ', -1) as middle_name, C.title, C.department, C.phone_home, C.phone_mobile, C.phone_work, C.primary_address_street, C.primary_address_city, C.primary_address_state, C.primary_address_postalcode, C.primary_address_country, C.deleted, EA.email_address as email_account, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(EA_C1.email_address), ',', 1), ',', -1) as email_2, 
    If(length(GROUP_CONCAT(EA_C1.email_address)) - length(replace(GROUP_CONCAT(EA_C1.email_address), ',', ''))>=1, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(EA_C1.email_address), ',', 2), ',', -1), NULL) as email_3, 
    If(length(GROUP_CONCAT(EA_C1.email_address)) - length(replace(GROUP_CONCAT(EA_C1.email_address), ',', ''))>=2, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(EA_C1.email_address), ',', 3), ',', -1), NULL) as email_4, 
    If(length(GROUP_CONCAT(EA_C1.email_address)) - length(replace(GROUP_CONCAT(EA_C1.email_address), ',', ''))>=3, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(EA_C1.email_address), ',', 4), ',', -1), NULL) as email_5, 
EA_C.email_address as email_contact, 
GROUP_CONCAT(EA_C1.email_address) as alt_email_contact 
FROM ACCOUNTS A 
INNER JOIN ACCOUNTS_CONTACTS AS AC ON A.id = AC.account_id 
INNER JOIN CONTACTS AS C ON C.id = AC.contact_id 
LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER ON ER.bean_id = A.id 
AND ER.bean_module = "Accounts" AND ER.primary_address =1 
LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER_C ON ER_C.bean_id = C.id 
AND ER_C.bean_module = "Contacts" AND ER_C.primary_address = 1 
LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER_C1 ON ER_C1.bean_id = C.id and ER_C1.deleted !=1 
AND ER_C1.primary_address !=1 
LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER_A1 ON ER_A1.bean_id = A.id AND ER_A1.deleted !=1 
and ER_A1.primary_address !=1 
LEFT JOIN EMAIL_ADDRESSES AS EA ON ER.email_address_id = EA.id 
LEFT JOIN EMAIL_ADDRESSES AS EA_C ON ER_C.email_address_id = EA_C.id 
LEFT JOIN EMAIL_ADDRESSES AS EA_C1 ON ER_C1.email_address_id = EA_C1.id 
AND EA_C1.invalid_email !=1 AND EA_C1.opt_out !=1 
LEFT JOIN EMAIL_ADDRESSES AS EA_A1 ON ER_A1.email_address_id = EA_A1.id 
AND EA_A1.invalid_email !=1 AND EA_A1.opt_out !=1 
GROUP BY A.ID 

Account_Contacts стол http://i.stack.imgur.com/KUECA.png

Моя главная проблема вращается вокруг двух внутренних соединений у меня есть в верхней части запроса На данный момент этот запрос дает мне всю информацию, мне нужно как для контакта и компания, однако, когда есть несколько контактов, связанных с одной компанией, она отображает только один контакт, а не тот и другой. Я хотел бы знать, как я могу изменить свой запрос, чтобы он отображал все контакты, даже если информация для компании одинакова, информация для контакта должна отличаться, и у них также должны быть разные идентификаторы.

Мне очень нужна помощь!

+0

Существует более одного стола. – Uueerdo

+0

Да, есть несколько, но моя главная проблема связана со счетами, контактами и account_contacts. Я вставлю изображение столов один момент. – ChewyMasta

+0

Таблица счетов: http: //i.stack.imgur.com/rK2lN.png – ChewyMasta

ответ

0

Вы используете GROUP BY A.ID. Он отобразит только одну запись, соответствующую этому идентификатору. Так отображается только один контакт. Таким образом, вы можете использовать GROUP BY c.id, A.id

+0

Хорошо, но я хочу показать всех контактов и связанных с ними компаний. A.id в этом случае является компанией. Так как я могу сделать так, чтобы он показывал ВСЕ контакты и компанию. даже если есть дубликаты информации о компании? – ChewyMasta

+0

изменить колонку заказ в группе. GROUP BY C.EMAIL_ID, A.ID –

+0

Хорошо, что теперь я группирую AC.id, но это дает мне дубликат одного дополнительного контакта (последний введен)? – ChewyMasta

0

Я не уверен, но я думаю, что вы могли бы упростить ваш запрос совсем немного (устранение многократного использования EMAIL_ADDR_BEAN_REL И EMAIL_ADDRESSES) с более сложное условие соединения на соединении с EMAIL_ADDR_BEAN_REL.

Нечто похожее на ниже фрагмент. Я немного изменил логику, угадывая некоторые возможные ошибки или ненужные условия; GUID использовать подсказки, которые вы, возможно, не нужно знать модуль «боб»:

... 
FROM ACCOUNTS A 
    INNER JOIN ACCOUNTS_CONTACTS AS AC ON A.id = AC.account_id 
    INNER JOIN CONTACTS AS C ON C.id = AC.contact_id 
    LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER 
     ON ER.bean_id IN (A.id, C.id) 
     AND (ER.primary_address = 1 OR ER.deleted != 1) 
    LEFT JOIN EMAIL_ADDRESSES AS EA ON ER.email_address_id = EA.id 
... 

Я подозреваю, что это, вероятно, упрощать все вещи вы делаете в пункте SELECT, а также.

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