我有这个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
到目前为止,一切都很好。但是,我要实现的目的是,如果电影的相关GenreID
与13
相关,那么第二个查询将返回0条记录。因此,在我上面关于电影的查询中具有13和8的相关流派的事实,我希望返回0条记录,因为电影的GenreID为13。如果它的GenreID为8、1和2,那么我想要返回3条记录。如果GenreID只有13,则我希望返回0条记录-它已经正确执行了。总结一下:与GenreID相关的13的任何电影都不应返回任何记录,即使它也具有其他链接的GenreID。。
如何实现?
答案 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个体裁,它最多返回单个MovieID
,271
。如果您想查找完整记录,我们可以尝试:
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