2017-01-19 14 views
0

내가 다음 테이블이 (이 새로운) 일부 SQL, 연습 해요 :SQL은없는 몇 가지 문제를 찾을 수있는

screening_occapancy(idscreening,row,col,idclient) 
screening(screeningid,idmovie,idtheater,screening_time) 

임 쿼리를 작성하려고하는 모든 영화를 본 클라이언트를 검색을 "screening"테이블에서 ID (idclient)를 보여줍니다.

이 (작동하지 않는) 내가 쓴 것입니다 :

select idclient from screening_occapancy p where not exists 
(select screeningid from screening where screeningid=p.idscreening) 

나는 아마 내가 잘못하고 있어요 또한 무엇을 설명하려고하시기 바랍니다 좋지 않다 알고있다.

P.S 내 임무는 사용하지/...

감사를하는 동안 존재! select distinct가 하위 쿼리에서 필요하지만

+0

서브 쿼리에서'DISTINCT '가 필요 없습니다. – jarlh

답변

0

귀하의 쿼리는 기본적으로 괜찮 :

select p.idclient 
from screening_occapancy p 
where not exists (select 1 
        from screening s 
        where s.screeningid = p.idscreening 
       ); 

주 :

  • 당신은 exists 하위 쿼리 아무것도를 선택할 수 있습니다. 열을 선택하면 오도 된 것입니다.
  • 테이블 별칭을 사용하고 특히 상관 된 하위 쿼리의 모든 열 참조에이 테이블 별칭을 사용합니다.
  • 테이블을 디자인하는 경우 기본 키와 외래 키에 동일한 이름 (screeningid 또는 idscreening)을 지정하는 것이 좋습니다.

편집 :

모든 영화를 본 고객을 원하는 경우에, 그때는이 접근 것 :

select p.idclient 
from screening_occapancy p 
group by p.idclient 
having count(distinct p.screening_occapancy p) = (select count(*) from screening); 
+0

감사합니다.하지만 내 + 귀하의 쿼리 복용량 작업 (모든 것을 본 클라이언트가 있지만 ...) – secret

0

왜 당신이 screening_table, 부하 영화의 수를 계산에 포함되지 않습니다 그것을 변수에 넣고 쿼리 결과의 결과를 변수에 대해 확인하십시오. (idmovie로 식별) 변수로 영화의

부하 번호 :

SELECT count(DISTINCT(idmovie)) FROM screening INTO @number_of_movies; 

체크 변수에 대한 쿼리의 결과 :

SELECT A.idclient, 
    count(DISTINCT(idmovie)) AS number_of_movies_watched, 
    FROM screening_occapancy A 
    INNER JOIN screening B 
    ON(A.idscreening = B.screeningid) 
    GROUP BY A.idclient 
    HAVING number_of_movies_watched = @number_of_movies ; 

당신이 참석, 모든 클라이언트를 찾으려면 모든 상영, idmovie를 screeningid로 바꿉니다.
MySQL에 비교적 익숙하지 않은 사람이라도이 쿼리를 사용하여 머리를 맞출 수 있습니다. "존재하지 않는다"- 접근은 이해하기가 더 어렵습니다.