2011-10-08 2 views
1

을 혼동 :SQL - 나는 '사진'테이블이 쿼리

photoID (INT), setID (INT).... 
18900 , 234 , ... 
18901 , 234 , ... 
18902 , 234 , ... 
18903 , 249 , ... 
18904 , 249 , ... 
18905 , 249 , ... 

나는 또한 'photoKeyword'테이블이 있습니다

photoID (INT), keywordID (INT) 
18900 , 12 
18900 , 21 
18901 , 17 
18905 , 26 
18905 , 10 
위 내 예에서 볼 수 있듯이

, 사진 18902을, 18903 및 18904 do 에는 photoKeyword 테이블에 키워드가 없습니다. 이것은 내가 설정하려고하는 것입니다.

나는 한 번에 하나의 setID가 있지만 하나의 키워드가없는 photoID의 목록을 생성하려고합니다. 보시다시피 사진 18902에는 키워드가 없으므로 18903과 18904도 있지만 세 개의 사진에는 두 개의 다른 setID가 있습니다.

이 검색어를 한 번 실행하면 사진 18902 만 반환됩니다. 그러면이 사진에 키워드를 추가하여 다시 문제가되지 않도록 할 수 있습니다. 다음에 쿼리를 실행하면 키워드가없는 사진의 다음 세트 (setID : 249) 인 사진 18903과 18904가 반환됩니다.

어떻게 가능합니까? SQL을 사용할 수 있습니까? 내가 성취하고자하는 것을 이해할 수 있기를 바랍니다.

감사받은 어떤 생각 ...

답변

0

은 당신이 그것에 대해 생각하면 ... 당신의 키워드를 확인 ... 이것은 당신이 매우 간단하다 필요한 수 있습니다

SELECT X.photoID FROM photos X 
INNER JOIN 
(SELECT DISTINCT P.setID FROM 
photos P 
LEFT OUTER JOIN (SELECT K.photoID, COUNT(*) C FROM photoKeyword K GROUP BY K.photoID) KC ON KC.photoID = P.photoID 
GROUP BY P.setID 
HAVING SUM (KC.C) < 1) Y ON X.setID = Y.SetID 
0
SELECT photoID 
    , setID 
FROM photos 
WHERE photoID NOT IN 
     (SELECT photoID 
     FROM photoKeyword 
    ) 
    AND setID = 
     (SELECT setID 
     FROM photos 
     WHERE photoID NOT IN 
      (SELECT photoID 
       FROM photoKeyword 
      ) 
     ORDER BY setID 
     LIMIT 1 
    ) 
+0

시간이 초과되었습니다. 나는 사진 테이블에 200 만 행을 가지고 있고 photoKeyword 테이블에 1,000,000+가 있습니다. – TheCarver

+0

질문에 : a) 테이블의 정의 (우리는 당신이 가지고있는 인덱스와 컬럼의 데이터 타입을 알고 있습니다)와 b) 쿼리의 EXPLAIN 계획 당신은 시도. 200K + 및 1M + 열을 사용하면 더 작은 테이블을 사용하여 쿼리를 시도한 다음 (올바른 결과를 반환하는지 확인) 큰 테이블을 사용하여 EXPLAIN 계획을 사용하여 어떤 인덱스가 사용되고 있는지, 어떤 파일이 없음을 확인하는 것이 좋습니다 등등. –

+0

'photos' 테이블의'(setID, photoID)'에 대한 색인이 좋을 것 같습니다. 그리고'photokeyword' 테이블의'photoID' 인덱스는 필수적입니다. –

0

시도 테이블에 사진 ID에 대한 색인이 있습니다.

LEFT 조인을 수행하면 항상 그는 두 번째 테이블. 그런 다음 두 번째 테이블에 일치 항목이없는 경우 우리는 조인하려고하는 ID가 null이 될 것이라는 것을 알고 있습니다. 따라서 두 번째 테이블에서 응답이 NULL 인 해당 조인 만 반환합니다.