所以我有一个查询如下:
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'
最后一行对此最为重要,它获得了所有COMEDY
电影的平均评分。
但是总的来说,我有几个与电影数据库相关的表,例如movies(title,id)
,genres(name,id)
,ratings(movie,rating)
,hasagenre(movie,genre)
..... Ex:>
Movie | Genre
------------------
Get Smart | Comedy
Get Smart | Romance
Scream | Horror
然后,我想编写一个查询,以获取COMEDY
和ROMANCE
的电影的平均收视率,例如Get Smart
。因此,我只更新了查询的最后一行如下:
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')**
但是,即使我知道数据库中有满足这两种类型的电影,这也不起作用并返回0行。这是怎么了?
同一列上的多条件AND
子句的正确语法是什么?
答案 0 :(得分:3)
如果将所有表连接起来形成平均值,则由于涉及多种流派,因此行数将相乘。取而代之的是先找出哪些电影符合两种类型的条件,然后对这些电影的平均收视率进行平均。
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
答案 1 :(得分:2)
使用和聚集条件
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 in('Comedy', 'ROMANCE')
group by hasagenre.genreid
having count(distinct genres.Name)=2
答案 2 :(得分:1)
您也可以两次加入流派:
SELECT AVG(ratings.rating)
FROM ratings
INNER JOIN movies
ON movies.movieid = ratings.movieid
INNER JOIN hasagenre as hasagenre1
ON hasagenre1.movieid = movies.movieid
INNER JOIN hasagenre as hasagenre2
ON hasagenre2.movieid = movies.movieid
INNER JOIN genres as genresComedy
ON hasagenre1.genreid = genresComedy.genreid and genresComedy.name = 'Comedy'
INNER JOIN genres as genresRomance
ON hasagenre2.genreid = genresRomance.genreid and genresRomance.name = 'Romance'
但是如果没有正确的索引,它可能会影响性能。