Как исключить некоторые данные в запросе SQL в зависимости от его разных значений? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующие 2 таблицы:

create table Director (

    id_director int,
    name varchar(255),
    primary key (id_director)
);

create table Movies (

    id_movie int,
    id_director int,
    title varchar(255),
    year int,
    primary key (id_movie),
    foreign key (id_director) references Director (id_director)
);

Некоторые данные уже добавлены в эти таблицы. Представьте, что данные:

Table Director

id_director       name
-------------------------
   1               Charles
   2               Jack
   3               Katia
   4               David

Table Movies

id_movie      id_director     title        year
------------------------------------------------
   1              2            title1      1999
   2              1            title2      2011
   3              1            title3      2019
   4              3            title4      2019
   5              4            title5      1968
   6              3            title6      2020
   7              2            title7      1977
   8              4            title8      2004
   9              1            title9      2020

Я хочу выполнить предложение SELECT, чтобы отфильтровать директоров, что это первый mov ie от 2019. Обратите внимание на пример, что только режиссер с id_director = 3 отвечает требованию, которое сняло 2 фильма, один на 2019 год, а другой на 2020 год.

Как я могу сделать это?

Я хотел бы получить вывод:

id_director          name
------------------------------
    3                Katia

Я пробовал это, но это явно неправильно, потому что некоторые directors, которые снимали фильмы до 2019 года, также сделали фильмы после 2019 года.

select director.id_director, director.name from director, movies
where director.id_director = movie.id_director and year = 2019
group by (name);

Я использую MySQL и полагаю, что могу сделать это с помощью подзапроса IN / NOT IN (но как)?

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

Попробуйте этот запрос

select d.id_director,d.name from director d
inner join movies m on
d.id_director=m.id_director
group by d.name,d.id_director
having min(m.year)>=2019;

С уважением,

Фабиано Понтес

1 голос
/ 20 февраля 2020

Если я правильно понимаю, вы хотите посмотреть на мин (год) для этого директора. Таким образом, SQL будет выглядеть примерно так:

select * from movies m
inner join directors d on m.id_director = d.id_director
where min(m.year) = 2019
group by d.id_director;
0 голосов
/ 20 февраля 2020

dbfiddle

SELECT id_director, name
FROM Director
WHERE 2019 = (SELECT MIN(year) 
              FROM Movies 
              WHERE Movies.id_director=Director.id_director);
0 голосов
/ 20 февраля 2020

Вы можете использовать коррелированный подзапрос:

select d.*
from director d  
where 2019 = (select min(m.year) from movies m where m.id_director = d.id_director);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...