Postgres-在单个列上有WHERE AND条件的多个条件?

时间:2018-10-27 05:43:08

标签: sql postgresql

所以我有一个查询如下:

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 

然后,我想编写一个查询,以获取COMEDYROMANCE的电影的平均收视率,例如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子句的正确语法是什么?

3 个答案:

答案 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'

但是如果没有正确的索引,它可能会影响性能。