2016-12-11 3 views
0

У меня проблема. Я создал базу данных с разными таблицами. У меня есть таблица под названием «фильм» с 108 фильмами. Эта таблица включает в себя столбцы «id, name, director, year, country», таблица с надписью «обзоры», которая содержит столбцы «movie_id» (ссылки movie_id на идентификатор фильма, который был просмотрен), «review_score» (от 1 до 5 баллов), «обзор (с текстом отзыва)», «critics_id» (который ссылается на критиков из таблицы критиков), , а также таблицу с именем «критики», которая включает столбцы «critics_name» и «critics_id». Проблема в том, что существует более 100 фильмов, но только 10 из них рассмотрены, и я должен перечислить только просмотренные фильмы, но обзоры и фильмы находятся в разных таблицах. Когда я пробую простую команду SELECT name, просмотрите ОТ фильм, обзоры - я получаю огромный список с повторяющимися фильмами (см. На картинке) my table Есть ли какая-либо команда, которая могла бы отображать только просмотренные фильмы и чтобы каждый просмотренный фильм был в списке только один раз? Спасибо заранее!Как перечислить только просмотренные фильмы?

ответ

-1

Здесь вы можете использовать соединение. Вы выберете из таблицы фильмов и присоединитесь к таблице обзоров, а затем отфильтрируйте фильмы, которые имеют объединенный обзор.

Например:

SELECT movie.*, review.review_score, review.review 
FROM movie 
LEFT JOIN reviews AS review 
    ON review.movie_id = movie.movie_id -- assuming this column name is correct... 
WHERE review.movie_id IS NOT NULL 

Вы также могли бы добавить еще один присоединиться к вашей критики таблицы:

SELECT movie.*, review.review_score, review.review, critic.critics_name 
FROM .... 
LEFT JOIN critics AS critic 
    ON critic.critics_id = review.critics_id 
WHERE critic.critics_id IS NOT NULL 

Пожалуйста, обратите внимание, что в этом примере используется left join, чтобы выделить способ, которым присоединиться работы, в том если он не найдет совпадение, тогда объединенный результат будет равен нулю.

Если вы использовали inner join, не получили бы результатов, которые не соответствуют запросу on, и поэтому вам не нужны детали WHERE id IS NOT NULL.

Внутренний присоединился примера выше будет возвращать фильмы, которые рассмотрены, а также имя критика:

SELECT movie.*, review.review_score, review.review, critic.critics_name 
FROM movie 
INNER JOIN reviews AS review 
    ON review.movie_id = movie.id 
INNER JOIN critics AS critic 
    ON critic.critics_id = review.critics_id 

Кроме того - я использую AS псевдоним множественного числа имен таблиц в единственное имя чисто по семантическим причинам. Вы можете продолжать использовать reviews и critics, если хотите без псевдонимов AS.

+0

Спасибо и очень много. Я изменил код, который вы мне дали SELECT movie. *, Reviews.review_score, reviews.review FROM movie LEFT JOIN отзывы AS отзывы ON reviews.movie_id = movie.id WHERE reviews.movie_id IS NOT NULL; и он работает! – Olli

-2

Надежда ниже запрос поможет вам:

SELECT 
    m.name, 
    c.critics_name, 
    r.review_score, 
    r.review_text 
FROM movies m 
    JOIN reviews r ON r.movie_id = m.id 
    JOIN critics c ON c.critics_id = r.critics_id 

для различных фильмов изменить запрос, как показано ниже:

SELECT DISTINCT m.name 
FROM movies m 
    JOIN reviews r ON r.movie_id = m.id 
    JOIN critics c ON c.critics_id = r.critics_id