2011-03-10 2 views
0

두 테이블에 회사 및 연락처 테이블이 있습니다. 연락처 테이블에 공통 필드 인 company_id가 포함되어 있습니다.mysql - 두 테이블 중 하나가 조인 레코드를 찾을 수 없을 때 어떻게 검색합니까?

검색을 쓰고 있으며 회사 이름과 연락처 테이블에서 정보를 반환하고 싶습니다. 내가 겪고있는 문제는 회사가 없어도 접촉이나 연락이없는 회사가있을 수 있다는 것입니다. 내가

SELECT c.name, k.name from contact c 
LEFT OUTER JOIN company k ON k.company_id = c.company id 
WHERE c.name like '%search_word%' || k.name like '%search_word%' 

를 작성하는 경우는 모두 내가 가진이나 기업이없는 연락처를 얻을

법적,하지만 난 연락처가 없습니다 회사를하지 않습니다.

사실 내 문제는 더욱 심각합니다. 회사는 많은 연락처를 가질 수 있기 때문에 company_id 및 contact_id가 포함 된 연관 테이블이 있습니다. 이제 회사와의 연결 테이블에서 회사로 이동해야하며 Full Outer 조인은 아무런 효과가 없습니다.

답변

3

전체 외부 조인을 찾고 있습니다. 그렇게하면 가능한 경우 두 테이블 모두에서 모든 레코드를 가져옵니다. 불행하게도, MySQL은 완전 외부 조인을 지원하지 않으므로 여기에 노조와 왼쪽 및 오른쪽 외부 조인을 사용하는 솔루션이 있습니다.

세 개의 테이블, companies, contactscompanies_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 | 
+---------+---------+ 

찾고있는 결과와 정확히 일치합니다.

+0

감사합니다. 구문은 무엇입니까? – sdfor

+2

'LEFT OUTER JOIN'이라고 말하는 것이 아니라 'FULL OUTER JOIN'이라고 말하면됩니다. –

+0

감사합니다. 실제로 연관 테이블을 통과하고 두 조인을 완전하게 만들고 문제를 변경하지 않기 때문에 제 질문을 편집했습니다. – sdfor

1

내가 제안 :

SELECT c.name, k.name from contact c 
FULL OUTER JOIN company k ON (k.company_id = c.company id) 
WHERE c.name LIKE '%search_word%' || k.name LIKE '%search_word%' 
AND NOT(c.name is null AND k.name is null); 

그래서 당신은 전체 널 결과를 얻을 수 없습니다.

+0

감사합니다. 연락처와 회사 사이에 연관 테이블이 있다는 것을 발견했기 때문에 질문을 다시 써야 할 것 같습니다. – sdfor

1
select c.name, k.name 
from association a 
right outer join company k on k.company_id = a.company_id 
right outer join contact c on c.company_id = a.company_id 
where c.name like '%search_word%' || k.name like '%search_word%' 
+0

감사합니다. 이것이 의미가 있습니다. 연관 레코드가 없다면 – sdfor

+0

을 시도 할 것입니다. 회사 또는 연락처 중 하나를 다시 가져 오십시오 – sdfor

+0

@sdfor 왼쪽에서 오른쪽으로 변경되었습니다. –

관련 문제