避免来自其他表的 select 数据

Avoid select data from other tables

我正在编写一个电影网络应用程序,用于显示一些标签我正在尝试编写一个查询,其中 return 是电影名称和分配给它的类别数。我正在尝试添加一个过滤器,例如:如果 X 电影包含“喜剧”类别,则在我的查询中甚至不需要考虑这部电影。

目前这是我的查询:

SELECT A.*, B.*, C.* -- A.name, count(C.name) [Categories]  
FROM movies A
INNER JOIN moviesGenres B ON A.id = B.movieId
INNER JOIN genres C ON B.genreId = C.id
WHERE C.name <> 'Comedy'
-- group by A.name, C.name
-- having count(C.name) > 2 

目前此查询正在return 预期输出。但是,如果您 运行 使用此 SQL Fiddle 中的数据进行查询,您会看到它正在考虑电影“Bad Boys”,但是这部电影分配了一个“喜剧”类别,因此来自这部电影的任何数据都应该不予考虑。

您需要将该条件放在 having 子句中,该子句是组的 [=12th=] 子句。

SELECT m.name, count(g.name) [Genres]  
FROM movies m
INNER JOIN moviesGenres mg ON m.id = mg.movieId
INNER JOIN genres g ON mg.genreId = g.id
GROUP BY m.name
HAVING sum(case when g.name = 'Comedy' then 1 else 0 end) = 0

如果您真的想要 select 来自 [moviesGenres] 和 [genres] 的列,请寻找 juergen 的答案。如果您不需要它们,anti join 它们:

SELECT A.*, B.*, C.* -- A.name, count(C.name) [Categories]  
FROM 
    movies A
WHERE NOT EXISTS
(
    SELECT 1
    FROM 
        moviesGenres Bneg
        inner join genres Cneg ON Bneg.genreId = Cneg.id
    WHERE 
        A.id = Bneg.movieId
        and Cneg.name = 'Comedy'
)