2016-07-19 7 views
0

부서 (회사가 속한)와 키워드로 회사를 검색하려는 DB (MySQL 5.5, Ubuntu 14.04)를 만듭니다. 이제 우리는 테이블이 있다고 가정 해 봅시다 -MySQL JOIN + 결과가 없습니다.

company (c_id,c_name) 
------------------------------- 
1 'A-Z hair' 
2 'My Coffee' 
3 'Boom Disco' 
4 'Go Cinema' 

keywords (c_fk , keyword) 
----------------- 
1 'haircut' 
1 'pruning' 
1 'coloring' 
2 'coffee' 
2 'tea' 
2 'free wifi' 

division(d_id , d_name) 
--------------- 
1 'shop' 
2 'service' 
3 'manufacturing' 
4 'engineering'  
5 'food' 
6 'entertainment' 

comp_div (c_fk , d_fk) 
----------------------- 
1 2 
2 5 
2 2 
4 6 

(.._ FK 열이 외래 키 연결은)
내가

(회사가 특정 부서 또는 부문 아무튼에 속하는 회사를 반환 여러 가지 선택 기준으로 선택이 필요 '문제') 및
(일부 회사의 키워드는 '무언가'또는 키워드는 중요하지 않음)

여기에 sqlfiddle link이 있습니다. 불행하게도 그래서 내가 예상대로 작동하고 모든 기업과 모든 행을 제공

SELECT c_id,c_name,d_fk,keyword FROM company 
LEFT JOIN comp_div ON c_id=comp_div.c_fk 
LEFT JOIN keywords ON c_id=keywords.c_fk 

가입 다음 만들어 내 검색 쿼리를 컴파일 시작 5.6

에서 테스트 5.5 모드가 작동하지 않는 몇 가지 버그와 MySQL의이 * 부서 * 키워드

그런 다음 추가로 결과를 구체화하고 싶습니다. 예를 들어 WHERE keyword = 'something'. 물론 NULL 비교에 문제가있어서 WHERE이 실패하고 쿼리가 결과를 제공하지 않습니다. 나는 키워드 및/또는 구분 매개 변수가 존재하지만 또한 존재하지 않는 경우에 대한 검색 요청을 확장하려고합니다. 그래서 내 생각은 이런 것입니다. -

SELECT c_id,c_name,d_fk,keyword FROM company 
LEFT JOIN comp_div ON c_id=comp_div.c_fk 
LEFT JOIN keywords ON c_id=keywords.c_fk 
WHERE (''=keyword OR keyword LIKE somethin%) AND 
(comp_div.d_fk=<division_fk> OR comp_div.d_fk = 0) 

나는 모든 방법을 필사적으로 시도합니다. ON으로 조건을 이동
1 .. 그것이 제공으로 이상한 방식으로 작동

SELECT c_id,c_name,d_fk,keyword FROM company  
LEFT JOIN comp_div ON c_id=comp_div.c_fk  
LEFT JOIN keywords ON (c_id=keywords.c_fk) AND (keyword='something') 

없이 WHERE 파생 테이블에 널 키워드로 모든

2.applying 결과 WHERE + IFNULL/COALESCE

SELECT c_id,c_name,d_fk,keyword FROM( 
SELECT c_id,c_name,d_fk,keyword FROM company  
LEFT JOIN comp_div ON c_id=comp_div.c_fk 
LEFT JOIN keywords ON c_id=keywords.c_fk) dt 
WHERE COALESCE(dt.keyword,'')='something' 

아마 어리석은 결과를 반환하지 않습니다.

작업을 수행하는 데 유용한 모범 사례를 알려주십시오. 감사.

+0

일부 샘플 데이터를 ** ** sql fiddle ** 공유 할 수 있습니까?또한 예상 출력을 표 형식으로 언급하십시오. – 1000111

+0

원본 게시물에 샘플 테이블과 sqlfiddle을 추가했습니다. – Anderquo

답변

0

시련과 연구의 다음 해결책을 찾은 후에 - 원래 의도는 각 조건 (구분, 키워드)에 대해 하나씩 2 개의 선택을 수행 한 다음 테이블을 교차하는 것이 었습니다. INTERSECT는 MySQL의에서 지원되지 않습니다, 그것은 여기처럼 IN 연산자 및 하위 쿼리에 의해 시뮬레이션 할 수 있습니다 - 유효한 기준이 적용되는 경우와 기준이 (생략되는 경우

SELECT c_id,c_name FROM company 
LEFT JOIN keywords K ON c_id=K.c_fk AND K.keyword LIKE @keyword 
WHERE (K.c_fk IS NOT NULL OR @keyword='') AND 
c_id IN (
SELECT c_id FROM company 
LEFT JOIN comp_div D ON c_id=D.c_fk AND D.d_fk = @division 
WHERE D.c_fk IS NOT NULL OR @division=-1) 
GROUP BY c_id 

트릭이 왼쪽으로 무슨 파악에있는이 결과를 가입 @ keyword = ''). 첫 번째 경우 (@keyword <> '') 우리는 NULL 값을 가진 모든 행을 제거해야하며, 일치하지 않는 행은 IS NOT NULL 절에 의해 수행됩니다.
후자의 경우 키워드가 무엇이든 관계없이 모든 행을 원합니다. Thats는 WHERE TRUE로 보장합니다. 두 번째 SELECT는 구조가 동일하며 구분 기준을 기준으로 사용합니다 (do not care는 -1). IN 구문을 더 많이 사용하면 필요한 수의 기준을 적용 할 수 있습니다.