전체 외부 조인을 찾고 있습니다. 그렇게하면 가능한 경우 두 테이블 모두에서 모든 레코드를 가져옵니다. 불행하게도, MySQL은 완전 외부 조인을 지원하지 않으므로 여기에 노조와 왼쪽 및 오른쪽 외부 조인을 사용하는 솔루션이 있습니다.
세 개의 테이블, companies
, contacts
및 companies_contacts
이 있는데,이 마지막 테이블은 연관 테이블입니다. 당신이 약간을 재고하는 경우
가
mysql> select * from companies;
+------------+---------+
| company_id | company |
+------------+---------+
| 1 | Foo |
| 2 | Bar |
| 3 | Baz |
+------------+---------+
3 rows in set (0.00 sec)
mysql> select * from contacts;
+------------+---------+
| contact_id | contact |
+------------+---------+
| 1 | Fred |
| 2 | Barney |
| 3 | Wilma |
| 4 | Betty |
+------------+---------+
4 rows in set (0.00 sec)
mysql> select * from companies_contacts;
+------------+------------+
| company_id | contact_id |
+------------+------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 4 |
+------------+------------+
4 rows in set (0.00 sec)
문제는 간단하게 : 다음은 세 가지의 각 내용의 당신이 회사와 함께 기준을 충족하는 모든 연락처를 원하는 그들의 가능한 경우와 관련, 당신은 모두를 원하는 가능한 경우 관련 연락처와 함께 기준을 충족하는 회사.
select company, contact
from companies
left join companies_contacts using (company_id)
left join contacts using (contact_id)
where company like '%B%';
그리고 :
select company, contact
from companies
left join companies_contacts using (company_id)
left join contacts using (contact_id)
where company like '%B%'
union
select company, contact
from companies
right join companies_contacts using (company_id)
right join contacts using (contact_id)
where contact like '%W%';
:
select company, contact
from companies
right join companies_contacts using (company_id)
right join contacts using (contact_id)
where contact like '%W%';
을 결과를 결합하여 두 사이의 중복을 제거합니다이 두 개의 쿼리 사이의 조합을 사용하여 우리는 두 개의 외부를 사용하여 이러한 두 가지 문제 조인을 해결할 수
위에서 언급 한 데이터에서 결과는 다음과 같습니다.
+---------+---------+
| company | contact |
+---------+---------+
| Bar | Barney |
| Bar | Betty |
| Baz | NULL |
| NULL | Wilma |
+---------+---------+
찾고있는 결과와 정확히 일치합니다.
감사합니다. 구문은 무엇입니까? – sdfor
'LEFT OUTER JOIN'이라고 말하는 것이 아니라 'FULL OUTER JOIN'이라고 말하면됩니다. –
감사합니다. 실제로 연관 테이블을 통과하고 두 조인을 완전하게 만들고 문제를 변경하지 않기 때문에 제 질문을 편집했습니다. – sdfor