2012-01-02 3 views
0

, 그것은 지금은 선택에 추가 할 필요가,이 특정 관리자의 asigned 그룹에있는 직원들에게 모든 작업 목록을 표시하는 쿼리를 가입 왼쪽이를 큰mysql은 join과 union을 남겼습니까?

SELECT * 
FROM jobs j 
LEFT JOIN groups g ON g.group_number = j.relevant_group 
WHERE j.relevant_group = 0 
OR (g.supervisor_id = j.job_lister_id AND g.employee_id = '$myVar') 

작동하지만 있도록 게시 감독자도 그것을 볼 수 있습니다, 나는 뷰어의 세션 ID를 보유하기 위해 $ myVar를 설정했습니다. 나는 내가 그 문제를 해결 할 방법이

SELECT * 
FROM jobs j 
LEFT JOIN groups g ON g.group_number = j.relevant_group 
WHERE j.relevant_group = 0 
OR (g.supervisor_id = j.job_lister_id AND g.employee_id = '$myVar') 
OR (j.job_lister_id = '$myVar') 

그러나 감독자 목록이 여러 번 게시보고 그가에 로그인 할 때 (중복 금액은 항상 그룹에있는 사람의 수와 동일) 를 시도?

답변

1

결과 집합에 포함될 groups의 필드가 실제로 필요합니까? 반환 할 jobs 레코드를 식별하는 데 단지 groups을 사용하고있는 것 같습니다. 그렇다면 JOIN을 없애고 하위 쿼리를 대신 사용해야합니다. 예를 들어, 다음과 같이 쓸 수 있습니다.

SELECT * 
    FROM jobs j 
WHERE j.job_lister_id = '$myVar' 
    OR j.relevant_group = 0 
    OR EXISTS 
     (SELECT 1 
      FROM groups g 
      WHERE g.group_number = j.relevant_group 
      AND g.supervisor_id = j.job_lister_id 
      AND g.employee_id = '$myVar' 
     ) 
; 
+0

예, 접근 방식이 훨씬 좋다고 생각합니다. 고마워요 –

+0

@FredTurner : 천만에요! – ruakh