2011-03-12 5 views
22

두 테이블이 있습니다 : projectsuser_licenses.MySQL LEFT JOIN (두 번째 테이블에서 선택적 값 사용)

데이터베이스의 프로젝트 전체 목록과 사용자의 현재 라이선스 상태를 얻고 싶습니다. 라이센스 테이블에는 값에 대한 $_SESSION 변수를 확인하는 사용자 ID 필드가 있습니다. 것은 라이센스가 없거나 로그인하지 않은 방문자가 프로젝트 목록을보고 싶어 할 수 있다는 것입니다. 내 질문은 : 어떻게 왼쪽 테이블에서 데이터를 얻을 수 항상 디스플레이,하지만 특정 조건이 충족되면 오른쪽 테이블에서 해당 행에 대한 데이터를 잡아? UserLicenses 조건 떨어진 곳에서

SELECT Projects.*, 
      UserLicenses.* 
    FROM Projects 
LEFT JOIN UserLicenses ON Projects.id = UserLicenses.project_id 
    WHERE UserLicenses.user_id = 12 
ORDER BY name ASC 
+0

샘플 데이터와 예상 출력을 제공해야 내가 생각하는대로 의사 소통을 할 수 있습니다. –

답변

38

가입 왼쪽의 on 절에 여분의 조건을 추가합니다. 조인 된 테이블에만 영향을 미칩니다.

SELECT Projects.*, 
      UserLicenses.* 
    FROM Projects 
LEFT JOIN UserLicenses 
     ON Projects.id = UserLicenses.project_id 
      and UserLicenses.user_id = 12 
      and UserLicences.Question = '6*7' 
      and UserLicences.Answer = 42 
ORDER BY name ASC 

일치하는 라이센스없이 프로젝트를 반환합니다. 그 조건에 일치하는 다음 값이 그렇지 않은 경우는 null 값 쇼를 보여 주면

+0

고마워요! 치료를해라. – Bojangles

+2

감사합니다! 따라서 핵심은 ON이 아닌 WHERE를 사용하는 것입니다. 내가 이것을 발견 할 때까지 나는 잠시 붙어 있었다. – tstyle

+0

나는 당신 때문에 십여 가지의 질문을 편집하려고 애썼다. –

3

이동 및 가입 조건까지 :

내가 지금 가지고있는 쿼리는 이것이다. 어디에서나 누락되면, "왼쪽"행은 필터링되지 않으므로 절대로 볼 수 없습니다.

WHERE (UserLicenses.user_id = 12 OR UserLicenses.user_id IS NULL) Do not do this. 다만이 같은 조인 조건으로 이동 :

LEFT JOIN UserLicenses ON (Projects.id = UserLicenses.project_id AND UserLicenses.user_id = 12)

0

당신은 LEFT JOIN

를 사용할 수 있습니다.

관련 문제