Postgres - несколько условий для одного столбца с условием WHERE и? - PullRequest
0 голосов
/ 27 октября 2018

Итак, у меня есть запрос:

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) ..... Пример:

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 в одном столбце?

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Вы также можете присоединиться к жанрам дважды:

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'

Но это может повлиять на производительность без правильных индексов.

0 голосов
/ 27 октября 2018

Если вы объедините все таблицы, чтобы сформировать среднее значение, вы умножите количество строк из-за нескольких задействованных жанров. Вместо этого выясните, какие фильмы сначала соответствуют условию 2 жанров, а затем усредните оценки только по этим фильмам.

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
0 голосов
/ 27 октября 2018

Условия использования и агрегации

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...