2012-03-07 3 views
2

MySQL 구문을 수정 중이지만 LEFT JOIN과 빈 행에 몇 가지 문제가 있습니다.MySQL LEFT JOIN - 값은 NULL 일 수 있습니다.

SELECT cs.case_id, cs.child_firstname, gu.* 
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu 
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%' 

이 쿼리는만큼 "tblguardians"테이블에 항목이있는 한 잘 작동하지만 어떤 기록이없는 경우 왼쪽은 NULL 반환 가입 - 따라서 항목이 반환되지 않습니다 : 순간에 나는이 PHP에서 결과를 반복 할 때.

"tblguardians"와 연결된 결과가 있는지 여부에 관계없이 "tblcases"에서 필드를 반환 할 수 있습니까? 나는 더 많은 정보를 얻기 위해 구글의 너무 많은 페이지를 읽었다 고 생각한다.

답변

10

WHERE 절의 조인 된 테이블에 조건을 추가하면 효과적으로 조인이 내부 조인이됩니다. 당신이 당신의 왼쪽에 두 번째 조건을 추가해야한다는 일을 방지하기 위해
는 가입 : 당신은 gu 필터링하고

SELECT cs.case_id, cs.child_firstname, gu.* 
    FROM tblcases cs 

     LEFT JOIN tblguardians gu 
     ON cs.case_id = gu.case_id 
    AND gu.firstname LIKE '%sally%' /* <- this line was moved up from WHERE */ 

    WHERE cs.child_firstname = '%craig%' 
+1

환상적인 답변, 대단히 감사합니다. 내 요구 사항을 충족시키기 위해 추가로 수정되었지만 정확한 목표를 달성했습니다. –

1

; tblguardians 테이블에 항목이 없으면 그 결과는 WHERE 절과 일치하지 않습니다.

4

쿼리를 약간 재구성해야합니다. WHERE 절에 조건을 넣으면 은 항상 전체 행을 제거합니다. tblguardians 항목은 LEFT JOIN 때문에 널이 될 수 있기 때문에 전체 행을 제거하지 않고도 firstname 열과 비교할 수 없습니다.

tblguardians에 일치하는 항목이 없더라도 결과를 얻으려면 해당 표에서 조건을 JOINON 조항으로 옮겨야합니다. 그러면 전체 행이 아닌 해당 테이블에서 행의 결과 만 제거 (NULL로 설정)됩니다.

+0

똑같은 좋은 답변과 같은 SQL을 동시에 게시했습니다. 가능하다면 두 번째 대답으로 받아 들여질 것입니다! –

0

LEFT JOIN 문은 올바른 공백 열이있는 곳의 결과 만 표시 할 수 있습니다. 둘 다 빈 열을 표시하려면 FULL OUTER JOIN을 사용해야합니다. 따라서 메서드를 사용하면 왼쪽 및 오른쪽 빈 열이 생깁니다.

SELECT cs.case_id, cs.child_firstname, gu.* 
FROM tblcases AS cs 
FULL OUTER JOIN tblguardians AS gu 
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%'