排除相关记录-协会有罪

时间:2019-01-02 14:05:01

标签: mysql sql

我有这个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

到目前为止,一切都很好。但是,我要实现的目的是,如果电影的相关GenreID13相关,那么第二个查询将返回0条记录。因此,在我上面关于电影的查询中具有13和8的相关流派的事实,我希望返回0条记录,因为电影的GenreID为13。如果它的GenreID为8、1和2,那么我想要返回3条记录。如果GenreID只有13,则我希望返回0条记录-它已经正确执行了。总结一下:与GenreID相关的13的任何电影都不应返回任何记录,即使它也具有其他链接的GenreID。

如何实现?

3 个答案:

答案 0 :(得分:2)

如果您想要原始记录,那么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;

实际上,在这种情况下,您可以将流派ID添加为列表:

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

答案 1 :(得分:0)

一个选项涉及聚合:

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

上面的查询有些琐碎,因为如果没有与之关联的13个体裁,它最多返回单个MovieID271。如果您想查找完整记录,我们可以尝试:

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);

答案 2 :(得分:0)

也许您需要拥有一个分组

        select * 
          from Movies_Genres 
          group by MovieId having count(GenreID=13) =0