避免来自其他表的 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'
)
我正在编写一个电影网络应用程序,用于显示一些标签我正在尝试编写一个查询,其中 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'
)