2010-04-17 5 views
1

내 쿼리 :MySQL의 필터링 결과는 외부 조인을 왼쪽으로 사용

 SELECT content.*, activity_log.content_id FROM content 
     LEFT JOIN activity_log 
     ON content.id = activity_log.content_id 
     AND sess_id = '$sess_id' 
     WHERE activity_log.content_id IS NULL 
     AND visibility = $visibility 
     AND content.reported < ".REPORTED_LIMIT." 
     AND content.file_ready = 1 
     LIMIT 1 

해당 쿼리의 목적은 (SESSION_ID로 식별) 사용자가 조회되지 않은 내용 테이블에서 1 개 행을 얻을 것입니다,하지만 아직 본 내용을 반환합니다. 뭐가 잘못 되었 니? (content_ids가 있는지 확인한 표를 확인했습니다)

참고 : 하위 쿼리, 생각을 사용하는 것보다 효율적이라고 생각하십니까?

+0

예, MySQL (atleast 5.0 이하)에서는 서브 쿼리를 사용하는 것보다 효율적입니다. 왜 쿼리가 작동하지 않는지 모르겠다. – Wolph

+0

WHERE 절에서 NULL이어야한다고 말했을 때 SELECT에서'activity_log.content_id'를 반환하는 점은 무엇입니까? –

+0

'activity_log.content_id'를 null로 지정할 수 있습니까? – Thomas

답변

1

문제는 분명히 JOIN 상태입니다. 사용중인 최적화 (기본 테이블에 조건을 적용)는 내부 조인 결과에 관심이있을 때 의미가 있지만 외부 JOIN의 경우 다음과 같이 읽습니다. 콘텐츠 ID가 일치 할 때 contentactivity_log 행 사이의 일치를 찾습니다. 및 세션 ID가 일치하고 콘텐츠 ID에 대한 로그가 누락되었거나 콘텐츠 ID가 누락되지 않았지만 세션 ID가 지정된이 아닌 경우 activity_log 행에 대해 null을 반환합니다. 그리고 그것은 당신이 원하는 것이 거의 없습니다.

귀하의 질의는 다음과 같이해야한다 : 성능이 최적이 아닌

SELECT content.*, activity_log.content_id 
FROM (
SELECT * 
FROM content 
WHERE sess_id = '$sess_id' 
    AND visibility = $visibility 
    AND file_ready = 1 
    AND reported < ".REPORTED_LIMIT." 
) as content 
LEFT JOIN activity_log 
ON content.id = activity_log.content_id 
WHERE activity_log.content_id IS NULL 
LIMIT 1; 

경우에 복합 인덱스를 만드는 것이 좋습니다 수 있습니다 (sess_id는, 가시성, fileready보고).

관련 문제