Выборка из нескольких таблиц inner join/outer join
Имеется таблица crm_contracts в которой каждая запись - это определённый контракт, который заключён с постояльцами. В контракте отдельное лицо - это клиент (клиент оплачивает услуги) и отдельно резидент (резидент получает услуги). Поскольку эти люди могут обращаться за услугами в пансионат ни раз, имеется таблица crm_orders (заявки), которая связывает между собой резидентов (residents), клиентов (clients), и контракты (contracts). Данные о клиентах живут в таблице crm_clients, данные о резидентах в таблице residents, Данные о контрактах в таблице crm_contracts.
Не для всех записей в таблице people имеются соответствующие записи в таблице addressies.
требуется вывести одним запросом следующие данные
crm_contracts.id
crm_contracts.date
crm_contracts.price
full_name - для резидента
full_name - для клиента
city - для резидента
city - для клиента
street - для резидента
street - для клиента
Вот, что я сделал на данный момент
SELECT crm_contracts.order_id, crm_contracts.date, crm_contracts.price, people.full_name, addressies.street, addressies.city
FROM ((addressies INNER JOIN people ON addressies.id = people.address_id)
INNER JOIN (crm_clients INNER JOIN crm_contracts ON crm_clients.id = crm_contracts.client_id) ON people.id = crm_clients.person_id)
INNER JOIN residents ON (residents.id = crm_contracts.resident_id) AND (people.id = residents.person_id);
В результате выводятся только те данные, в которых id резидента и клиента одинаковые. Правильным должен быть запрос, которые даст город, улицу и ФИО для резидента и клиента. Подскажите как изменить запрос для корректного выполнения?
Ответы (2 шт):
SELECT crm_contracts.id, crm_contracts.date, crm_contracts.price, people.full_name, addressies.city, addressies.street
FROM addressies
JOIN people ON addressies.id = people.registration_address_id
JOIN residents ON people.id = residents.person_id
JOIN crm_clients ON people.id = crm_clients.person_id
JOIN crm_contracts ON (residents.id = crm_contracts.resident_id) AND (crm_clients.id = crm_contracts.client_id)
select
C.id,
C.date,
C.price,
R.full_name as [Resident Name],
CC.full_name as [CRM Client Name],
AR.city as [Resident City],
AC.city as [CRM Client City],
AR.street as [Resident Street],
AC.street as [CRM Client Street],
from crm_contracts C LEFT OUTER JOIN residents R ON C.resident_id = R.id
LEFT OUTER JOIN crm_clients CC ON C.resident_id = CC.id
LEFT OUTER JOIN people PR ON R.person_id = PR.id
LEFT OUTER JOIN people PC ON CC.person_id = PC.id
LEFT OUTER JOIN addressies AR ON PR.addressies = AR.id
LEFT OUTER JOIN addressies AC ON PC.addressies = AC.id
