2013-01-12 2 views
-2

В настоящее время я беру онлайн-класс standford в базах данных. Если бы вы могли помочь мне решить эту проблему sql, я был бы очень признателен. Извините, я полный noob.Поиск среднего рейтинга каждого фильма SQL

Таблицы фильм:

mID | title | year | director 

Таблица Рейтинг

rID | mID | stars | ratingDate 

Таблица Рецензент

rID | name 

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

+1

Есть ли у вас пример данных? Вы хотите получить средний рейтинг за фильм и уникальные имена рецензентов. Это правильный перевод? – Jacco

+0

@lester для быстрого и лучшего ответа - вам, по крайней мере, нужно предоставить короткие данные образца и соответствующую итоговую таблицу – exexzian

ответ

0

Это поможет вам начать работу.

SELECT m.*, ra.*, re.* 
FROM Movie m 
JOIN Rating ra ON ra.mID = m.mID 
JOIN Reviewer re ON re.rID = ra.rID 
0

Может быть что-то вроде этого:

SELECT rev.rID, rev.name, m.title 
FROM [Reviewer] rev 
    JOIN [Rating] rate ON rev.rID = rate.rID 
    JOIN [Movie] m ON rate.mID = m.mID 
    JOIN (
    SELECT mID 
    FROM [Rating] 
    GROUP BY mID 
    HAVING COUNT(Distinct rID) > 1 
    ) m2 on m.mID = m2.mID 
ORDER BY rev.name 

--edit

Если вам необходимо получить среднее, а также:

SELECT rev.rID, rev.name, m.title, ar.avgRating 
FROM [Reviewer] rev 
    JOIN [Rating] rate ON rev.rID = rate.rID 
    JOIN [Movie] m ON rate.mID = m.mID 
    JOIN (
    SELECT mID 
    FROM [Rating] 
    GROUP BY mID 
    HAVING COUNT(Distinct rID) > 1 
    ) m2 on m.mID = m2.mID 
    JOIN (
    SELECT mID, AVG(stars) as avgRating 
    FROM [Rating] 
    GROUP BY mID 
    ) ar on m.mID = ar.mID 
ORDER BY rev.name 

И SQL Fiddle.

+0

Ваш пропущенный заголовок этого сообщения ... «средний рейтинг» – Jacco

+0

Хехе - даже не прочитал название, просто прочитайте абзац с просьбой о возврате. Могу добавить, что :-) Спасибо @Jacco. – sgeddes

+0

Я тоже прочитал абзац и искал настоящий вопрос ... Нашел его в названии. Но ваш ответ отключен для части «не спаривайте рецензентов с собой» при использовании более крупного образца данных. – Jacco

0

Найти среднюю оценку за фильм:

SELECT 
    [m].[mID], 
    [m].[title], 
    AVG([r].[stars]) AS [AvgRating] 
    FROM [Movie] [m] 
    LEFT JOIN [Rating] [r] ON [m].[mID] = [r].[mID] 
    GROUP BY 
    [m].[mID], 
    [m].[title] 

Найти уникальные рецензентов за фильм:

SELECT 
    [r].[mID], 
    [v].[rID], 
    [v].[name] 
    FROM [Reviewer] [v] 
    INNER JOIN [Rating] [r] ON [v].[rID] = [r].[rID] 
    GROUP BY 
    [v].[rID], 
    [v].[name], 
    [r].[mID] 

комбинат:

SELECT 
    [rat].[mID], 
    [rat].[title], 
    [rev].[rID], 
    [rev].[name], 
    [rat].[AvgRating] 
FROM 
(
    SELECT 
    [m].[mID], 
    [m].[title], 
    AVG([r].[stars]) AS [AvgRating] 
    FROM [Movie] [m] 
    LEFT JOIN [Rating] [r] ON [m].[mID] = [r].[mID] 
    GROUP BY 
    [m].[mID], 
    [m].[title] 
) AS [rat] 
LEFT JOIN 
(
    SELECT 
    [r].[mID], 
    [v].[rID], 
    [v].[name] 
    FROM [Reviewer] [v] 
    INNER JOIN [Rating] [r] ON [v].[rID] = [r].[rID] 
    GROUP BY 
    [v].[rID], 
    [v].[name], 
    [r].[mID] 
) AS [rev] ON [rat].[mID] = [rev].[mID] 
ORDER BY 
    [rat].[mID] ASC, 
    [rev].[name] ASC 

Для Fiddle, look here.

0
select distinct r2.name, r1.name 
from 
(select r1.rid, r1.mid, r2.name 
from (select * from reviewer order by name) r2 
join (select r1.rid, r1.mid from rating r1 join reviewer r2 on r1.rid = r2.rid order by r2.name) r1 
on r2.rid = r1.rid 
group by mid 
order by r2.name) r1, 
(select r1.rid, r1.mid, r2.name 
from reviewer r2, 
rating r1 
where r1.rid = r2.rid)r2 
where r1.rid <> r2.rid and r1.mid = r2.mID 
order by r2.name, r1.name 
0

Я делаю тот же курс, и это ответ, который я получил:

SELECT DISTINCT name1, name2 
FROM (SELECT R1.name AS name1, R2.name AS name2 
FROM (Rating JOIN Reviewer using(rId)) AS R1, 
(Rating JOIN Reviewer using(rId)) AS R2 
WHERE R1.mId = R2.mId AND R1.rId <> R2.rId) AS Tuple 
WHERE name1 < name2; 

Я не знаю, почему О.П. говорить о среднем по названию, так как этот вопрос не просят Это.

EDIT: для получения дополнительной справки, вот данные: https://class.stanford.edu/c4x/DB/SQL/asset/moviedata.html

1

Хорошо. Вы действительно задали два разных вопроса.

Во-первых, я отвечу на вопрос, который вы задали в заголовке сообщения.

Это должно сработать.

select Movie.title, avg(Rating.stars) as AR from 
Rating join Movie on Rating.mID = Movie.mID 
group by Movie.title 
order by AR desc 

Если не указать «на» пункте в соединении, как это,

select Movie.title, avg(Rating.stars) as AR from 
Rating join Movie 
group by Movie.title 
order by AR desc 

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

Во-вторых, вот ответ на другой вопрос, который вы задали, о парах рецензентов. R1.name < R2.name гарантирует, что имена рецензентов будут отсортированы слева направо. и order by R1.name гарантирует, что эти пары будут отсортированы сверху вниз.

select distinct R1.name, R2.name from 
Rating Ra1 join Rating Ra2 
join Reviewer R1 join Reviewer R2 
where Ra1.mID = Ra2.mID and Ra1.rID != Ra2.rID 
and R1.name < R2.name 
and Ra1.rID = R1.rID and Ra2.rID = R2.rID 
order by R1.name