A movie streaming app is currently being developed by a start-up. A movie can belong to one or more genres. Given below is the table definitions for movies and genres:
TABLE genres
id INTEGER PRIMARY KEY
name VARCHAR(50) NOT NULL
TABLE movies
id INTEGER PRIMARY KEY
name VARCHAR(50) NOT NULL
TABLE moviesGenres
movieId INTEGER REFERENCES moviesid
genreId INTEGER REFERENCES genresid
PRIMARY KEY(movieId, genreId)
A particular search parameter requires all movies which belong to more than two genres and none of the genres are ‘Comedy’.
Write a query for the above criteria that returns:
The movie’s name. The number of genres the movie belongs to.
write the query considering all scenarios: I have written this query but i am not able to satisfy one test case:
select m.name, count(mg.genreId)
from movies m
join
moviesgenres mg
on m.id=mg.movieId
where mg.genreId not in (select id from genres where name='Comedy')
group by m.id,m.name
HAVING count(mg.genreId)>2
Mentioned below is the test case that I am missing:
Some movies have more genres, some movies are Comedy: Wrong answer
Advertisement
Answer
This solution uses a subquery and a variable (tested in sql server):
Declare @comedyGenreID int;
Select @comedyGenreID = id from genres where name='Comedy'
Select name, genres
From (select m.name, count(g.id) as genres
from movies m
inner join moviesgenres mg on mg.movieid = m.id
inner join genres g on g.id = mg.genreid
where mg.genreid <> @comedyGenreID
groupby m.name) as sq
Where genres > 2
I guess you could decide to not use the variable and use the ‘Comedy’ string directly in the subquery as well, like this:
where g.name <> 'Comedy'