2014-01-23 2 views
0

WHERE 절의 일부를 만드는 가장 간단한 방법은 JOIN의 결과에 따라 달라 집니까? 나는 그것이 매우 모호하고 혼란 질문 실현, 그래서 나를 단순히 내가 달성하기 위해 노력하고 무엇을 보여줄 수 : 구문-I는 CodeIgniter의를 사용하고있는 물음표가 유효하지 참고,일치하는 경우 WHERE 절

SELECT m.member_id, m.first_name, m.last_name 
FROM cal_form_answers a 
INNER JOIN cal_form_elements e 
    USING(element_id) 
INNER JOIN cal_forms f 
    USING(form_id) 
LEFT JOIN members m 
    USING(member_id) 
WHERE f.org_id = ? 
    AND m.org_id = ? 
    AND e.form_id = ? 
GROUP BY a.member_id 
ORDER BY a.member_id 

우선하는 이를 바운드 매개 변수로 사용합니다.

라인 10 (AND m.org_id = ?)은 실제로 LEFT JOIN이 무언가를 찾았는지 여부에 달려 있습니다. members 테이블에 일치하는 항목이 없으면 Line 10이 필요하지 않게됩니다. 사실 그것은 문제가됩니다. 내가 라인 10 에 의해 결과를 제한하고 싶습니다가 일치하지 않는 경우 회원 테이블. 그 경우에, 나는 단지 WHERE 절의 그 부분을 무시하고 싶습니다.

나는 구문을 어떻게 작동시키는 지 확실하지 않지만 서브 쿼리를 사용하여이를 수행 할 수 있다고 생각합니다. 다른 방법이 있습니까? 그렇다면이 결과를 어떻게 얻을 수 있습니까? 다른 방법이없는 경우 누군가이 상황에 대한 하위 쿼리 구현을 보여줄 수 있고 어떻게 작동하는지 설명 할 수 있습니까?

감사합니다.

+1

그러면 조인 조건 부분에 이러한 조건을 지정하지 않는 이유는 무엇입니까? – zerkms

답변

0

LEFT JOIN이 레코드와 일치하지 않으면 LEFT JOIN 된 필드는 null입니다. 해당 필드가 NULL인지 확인한 후 확인하지 않는 것이 좋습니다.)

SELECT m.member_id, m.first_name, m.last_name 
FROM cal_form_answers a 
INNER JOIN cal_form_elements e 
    USING(element_id) 
INNER JOIN cal_forms f 
    USING(form_id) 
LEFT JOIN members m 
    USING(member_id) 
WHERE f.org_id = ? 
    AND (m.org_id = ? OR m.org_id IS NULL) 
    AND e.form_id = ? 
GROUP BY a.member_id 
ORDER BY a.member_id 
+0

아, 어리석은 나. 수년간의 웹 사이트 개발에도 불구하고 나는 여전히 SQL로 명확하게 생각할 수 없다. 나는 그것이 단순하다는 것을 알았다! 감사. :) – Nathanael