Исключить связанные записи - вина по ассоциации - PullRequest
0 голосов
/ 02 января 2019

У меня есть запрос MySQL:

select * 
from Movies_Genres 
where MovieID = 271

Возвращает следующий набор записей:

ID    MovieID  GenreID
======================
924   271      8
1251  271      13

Movies_Genres - это таблица объединения / соединения со связями many-many.

Теперь, если я выполню этот слегка измененный запрос:

select * 
from Movies_Genres 
where MovieID = 271
and GenreID <> 13

Я получаю следующий набор записей:

ID    MovieID  GenreID
======================
924   271      8

Пока все хорошо. Но я пытаюсь добиться, чтобы для этого второго запроса было возвращено 0 записей, если у фильма есть GenreID из 13. Итак, тот факт, что в моем запросе выше фильм имеет связанные жанры 13 и 8, я хочу, чтобы 0 записей возвращалось, потому что у фильма был GenreID, равный 13. Если у него был GenreID, скажем, 8, 1 и 2 - тогда Я хотел бы вернуть 3 записи. Если бы он имел GenreID только 13, я хотел бы вернуть 0 записей - что он и так делает правильно. Подводя итог: Любой фильм со связанным GenreID, равным 13, никогда не должен возвращать никаких записей, даже если он также имеет другие связанные GenreIDs .

Как этого достичь?

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Возможно, вам нужна группа с

        select * 
          from Movies_Genres 
          group by MovieId having count(GenreID=13) =0
0 голосов
/ 02 января 2019

Если вам нужны исходные записи, тогда not exists кажется подходящим:

select mg.* 
from Movies_Genres mg
where not exists (select 1
                  from movies_genres mg2
                  where mg2.MovieID = mg.MovieID and 
                        mg2.GenreID = 13
                 );

Если вы просто хотите фильмы, а не детали genreID, вы можете использовать group by:

select mg.MovieID
from Movies_Genres mg
group by mg.MovieID
having sum( mg2.GenreID = 13 ) = 0;

Фактически, вы можете добавить идентификаторы жанров в виде списка в этом случае:

select mg.MovieID, group_concat(mg.GenreID) as genreids
from Movies_Genres mg
group by mg.MovieID
having sum( mg2.GenreID = 13 ) = 0;
0 голосов
/ 02 января 2019

Один вариант включает агрегирование:

SELECT MovieID
FROM Movies_Genres
WHERE MovieID = 271
GROUP BY MovieID
HAVING COUNT(CASE WHEN GenreID = 13 THEN 1 END) = 0;

Вышеприведенный запрос несколько тривиален, поскольку он в большинстве случаев возвращает один MovieID, 271, если с ним не связано 13 жанров. Если вы хотите найти полные записи, мы можем попробовать:

SELECT mg.*
FROM Movies_Genres mg
WHERE mg.MovieID NOT IN (SELECT MovieID FROM Movies_Genres GROUP BY MovieID
                         HAVING COUNT(CASE WHEN GenreID = 13 THEN 1 END) > 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...