2013-05-29 2 views
2

두 개의 외래 키 (movie_id, genre_id)이있는 테이블 (movies)이 있습니다. 물론 두 필드는 고유하지 않습니다.이 관계형 구분 쿼리를 해결하는 방법은 무엇입니까?

내 질문은 다음과 같습니다 두 개 이상의 특정 장르가있는 영화를 선택하고 싶습니다. 그래서 다음과 같이하고 싶습니다.

SELECT movie_id 
FROM movies 
WHERE genre_id = 1 AND genre_id = 2 AND genre_id = 3 

어떻게해야합니까? 감사합니다.

답변

6

이것은 Relational Division 문제입니다.

genre_id 모든 movie_id에 대한 고유하지 않으면

SELECT movie_id 
FROM movies 
WHERE genre_id IN (1, 2, 3) -- <<== list of genre_id 
GROUP BY movie_id 
HAVING COUNT(*) = 3   -- <<== count of genre_id 
이하는 DISTINCT 키워드는 독특한 사람을 필터링하는 데 필요합니다.

SELECT movie_id 
FROM movies 
WHERE genre_id IN (1, 2, 3)    -- <<== list of genre_id 
GROUP BY movie_id 
HAVING COUNT(DISTINCT genre_id) = 3  -- <<== count of genre_id 
+0

정말로 감사합니다. 괜찮 았어. 나는 그것을 해결할 방법을 찾지 못했습니다. – Fosfor

+0

당신은'')''RDBMS를 사용하고 있습니까? –

+0

실제로 MySQL을 사용 중입니다. – Fosfor

2

이것은 "set-within-sets"쿼리의 예입니다. 내가 가장 일반적인 방법은 having 절에 모든 조건을 넣어 생각 :

SELECT movie_id 
FROM movies 
group by movie_id 
having sum(case when genre_id = 1 then 1 else 0 end) > 0 and 
     sum(case when genre_id = 2 then 1 else 0 end) > 0 and 
     sum(case when genre_id = 3 then 1 else 0 end) > 0; 

having 절의 조항의 각

장르의 각 유형에 맞는 레코드의 수를 계산한다.