Для всех пар рецензентов, чтобы оба рецензента дали оценку одному и тому же фильму, возвращаются имена обоих рецензентов. - PullRequest
0 голосов
/ 15 марта 2019

В настоящее время я прохожу Стэнфордский курс самообучения по SQL, и этот вопрос они задают.

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

Вот схема

Movie ( mID, title, year, director ) 

Английский: есть фильм с идентификационным номером mID, названием, годом выпуска и режиссером.

Reviewer ( rID, name ) 

Английский: Рецензент с идентификационным номером rID имеет определенное имя.

Rating ( rID, mID, stars, ratingDate ) 

Русский: RID рецензента присвоил фильму mID количество звездочек (1-5) на определенную дату рейтинга.

Моя попытка:

Select R.Name, R2.Name 
From Reviewer R 
    Join Reviewer R2 on (R.rID = R2.rID)
    Join Rating Rt on (Rt.rID = R2.rID) 
    Join Rating Rt2 on (Rt2.rID = R.rID)
 Where Rt.MID = Rt2.mID and R.rID < r2.rID

Логика: я знаю, что мне нужно иметь таблицу с 2 столбцами «Имя обозревателя» и 2 столбцами «Фильм». Я применяю условие так, чтобы фильмы были равны друг другу, и условие, что идентификаторы не могут быть такими же, как в вопросе Не объединяйте рецензентов с собой, и включайте каждую пару только один раз.

Мой результат пуст. (неверно) Что я делаю не так, и может кто-нибудь объяснить мне, чтобы я мог понять логику этого? Буду признателен, спасибо заранее!

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы должны присоединить таблицу rating дважды к таблице movie и для каждого объединения присоединиться к таблице reviewer.
Затем отфильтруйте результат, чтобы рецензенты не были соединены друг с другом, и с помощью функций distinct и min() и max() убедитесь, что каждая пара не повторяется:

select distinct
  min(v1.name, v2.name) reviewer1,
  max(v1.name, v2.name) reviewer2
from movie m
inner join rating r1 on r1.mid = m.mid
inner join rating r2 on r2.mid = m.mid
inner join reviewer v1 on v1.rid = r1.rid
inner join reviewer v2 on v2.rid = r2.rid
where v1.rid <> v2.rid
order by reviewer1, reviewer2
1 голос
/ 15 марта 2019

Я бы начал с самостоятельного присоединения к рейтингу, а затем ввел имена

select distinct rv.name, rv2.name
from rating r1 join
     rating r2
     on r1.mid = r2.mid join
     reviewer rv1
     on rv1.rid = r1.rid join
     reviewer rv2
     on rv2.rid = r2.rid and rv.name < rv2.name;

Ваш запрос на самом деле очень похож.Я думаю, что основной проблемой является select distinct и порядок по имени вместо идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...