So I have a query as follows:
SELECT AVG(ratings.rating) FROM ratings INNER JOIN movies ON movies.movieid = ratings.movieid INNER JOIN hasagenre ON hasagenre.movieid = movies.movieid INNER JOIN genres ON hasagenre.genreid = genres.genreid WHERE genres.name = 'Comedy'
The last line is most important for this, it gets the average rating of all COMEDY
movies.
But overall, I have a couple of tables related to a movie database like movies(title,id)
,genres(name,id)
,ratings(movie,rating)
,hasagenre(movie,genre)
…..Ex:
Movie | Genre ------------------ Get Smart | Comedy Get Smart | Romance Scream | Horror
I then want to write a query that gets the average rating of movies that are both COMEDY
and ROMANCE
, i.e like Get Smart
.Thus, I simply updated the last line of query as follows:
SELECT AVG(ratings.rating) FROM ratings INNER JOIN movies ON movies.movieid = ratings.movieid INNER JOIN hasagenre ON hasagenre.movieid = movies.movieid INNER JOIN genres ON hasagenre.genreid = genres.genreid **WHERE (genres.name = 'Comedy' AND genres.name = 'Romance')**
However, that doesn’t work and returns 0 rows even though I know for a fact that there are movies that satisfy both genres in the database. What is going wrong here?
What is the proper syntax for an multiple condition AND
clause on the same column?
Advertisement
Answer
If you join all the tables to form an average you will multiply the number of rows due to the multiple genres involved. Instead figure out which movies meet the 2 genre condition first, then average the ratings of just those movies.
SELECT AVG(ratings.rating) FROM ratings INNER JOIN ( SELECT hasagenre.movieid FROM hasagenre INNER JOIN genres ON hasagenre.genreid = genres.genreid WHERE genres.Name IN ('Comedy', 'Romance') GROUP BY hasagenre.movieid HAVING COUNT(DISTINCT genres.Name) = 2 ) m ON ratings.movieid = m.movieid