我正在撰寫一個電影網路應用程式,為了顯示一些標簽,我正在嘗試撰寫一個查詢,該查詢回傳電影名稱和分配給它的類別數量。我正在嘗試添加一個過濾器,例如:如果 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
目前,此查詢正在回傳預期的輸出。但是,如果您使用此SQL Fiddle中的資料運行該查詢,您會看到正在考慮電影“Bad Boys”,但該電影已分配一個“喜劇”類別,因此不應考慮該電影中的任何資料。
uj5u.com熱心網友回復:
您需要將該條件放在作為組having的子句的where子句中。
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
uj5u.com熱心網友回復:
如果您真的想從 [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'
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431793.html
