2017-01-19 6 views
0

Я практикуя некоторую SQL (новой к этому), У меня есть следующие таблицы:SQL не существует, чтобы найти некоторые проблемы

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

Im пытается создать запрос для поиска, который клиенты смотрел все фильмы в таблице «экранирование» и показать их идентификатор (idclient).

это то, что я написал (который не работает):

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

Я знаю, что это, вероятно, не так хорошо, поэтому, пожалуйста, попробуйте объяснить и то, что я делаю неправильно.

P.S Моя миссия состоит в том, чтобы использовать не/существует, а это делает ...

Спасибо!

+0

Нет необходимости в этом 'DISTINCT' в подзапросе. – jarlh

ответ

0

Ваш запрос в основном хорошо, хотя select distinct ненужно в подзапрос:

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

Примечания:

  • Вы можете выбрать ничего в exists подзапроса. Выбор столбца вводит в заблуждение.
  • Используйте псевдонимы таблиц и используйте их для всех ссылок на колонки, особенно в коррелированном подзапросе.
  • Если вы проектируете таблицы, я бы посоветовал указать первичный ключ и внешний ключ с тем же именем (screeningid или idscreening, но не оба).

EDIT:

Если вы хотите клиентов, которые смотрели все фильмы, то я бы подойти к этому как:

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 на скрининг.
Даже тот, кто относительно новичок в MySQL, может обдумать этот вопрос. «Не существует» -подход труднее понять.

 Смежные вопросы

  • Нет связанных вопросов^_^