2012-03-08 3 views
1

갤러리와 갤러리를 연결하는 3 개의 테이블이 포함 된 mySQL 데이터베이스가 있습니다. 이미지는 "파일"테이블과 "갤러리"테이블의 갤러리에 저장되므로 중간에 "gallery_files"라는 테이블을 사용하여 연결합니다. "gallery_files"테이블은 주 테이블 각각의 2 개의 ID (F_ID, G_ID)로 구성됩니다.동일한 쿼리에서 mySQL 이중 필터링

파일/이미지를 둘 이상의 갤러리와 연결할 수 있으므로 서로 다른 G_ID에 대해 동일한 F_ID의 "gallery_files"레코드가있을 수 있습니다.

이제는 주어진 갤러리와 이미 연관되지 않은 모든 이미지를 가져 오는 mySQL 쿼리를 작성하려고합니다.

(의는 ID와 갤러리를위한 가정 해 봅시다 : 9)

SELECT * FROM files 
INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID 
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 
    AND gallery_files.G_ID <> 9 

내 문제가있을 경우 다른 갤러리와 관련된 이미지의 기록은 아직도 그것을 가져 오는 것입니다 그래서 나는 다음과 같은 쿼리를 사용 . 나는 이것이 왜 일어나는지를 안다.하지만 나는 똑똑한 질문을 할 수 없다. 2 개의 쿼리를 사용하여이를 해결하는 방법을 알고 있지만 가능한 경우이를 피하고 싶습니다.

의견이 있으십니까?

답변

1

, 당신은 내부 일치하지 않는 행을 선택 외부 조인을 사용, 만에 NULL 열을 확인할 수 있습니다 조인

ON 절에 G_ID 조건을 둬서
SELECT * FROM files 
LEFT JOIN gallery_files ON files.F_ID=gallery_files.F_ID AND gallery_files.G_ID = 9 
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 
    AND gallery_files.G_ID IS NULL 

JOIN는이 존재하는 경우는 gallery_files 테이블의 갤러리-9 행에 각 파일을 조인하거나하지 않는 경우에 NULL로 (그것이 외부 이후 가입). 그런 다음

의 gallery_files 열 (나는 G_ID을 확인하지만, 모든 열이 일한 것)에 NULL를 확인하여, 우리는 이 아닌 갤러리에서

+0

9. 정말 감사했다 files에서 해당 행을 얻을 . 저것은 일했다! :) –

0

나는 NOT IN 성명서는 당신이 원하는대로해야한다고 생각합니다. 의 라인을 따라

뭔가 : 부질없이

SELECT * 
FROM files 
WHERE files.F_ID NOT IN 
    (SELECT files.F_ID 
    FROM files 
    INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID 
    WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 AND gallery_files.G_ID = 9) 
관련 문제