Ваши запросы не дают того, что вы думаете, они производят по ряду причин.
Вот то, что вы действительно ищете, я думаю:
SELECT
movie.mid
movie.title,
(MAX(rating.stars)-MIN(rating.stars)) AS ratingspread
FROM
movie
INNER JOIN rating on movie.mid = rating.mid
GROUP BY
movie.mid,
title
ORDER BY
(MAX(stars)-MIN(stars)) DESC,
title
Есть несколько вещей, на которые следует обратить внимание: во-первых, вам нужно присоединиться к соответствующей колонке - в некоторых ваших запросы, к которым вы присоединяетесь, чтобы избавиться - это несвязанные поля. Идентификатор mov ie - это то, что соединяет рейтинг с mov ie. Во-вторых, вы не получаете концепцию GROUP BY
. То, что вы пытаетесь сделать, это получить разброс рейтингов для данного mov ie и отобразить его заголовок, поэтому, чтобы отобразить его заголовок (и любые другие не обобщенные данные), вы должны включить поле в группу по. Для дальнейшей иллюстрации представьте, что вы хотели получить распространение всех рецензий от каждого рецензента, чтобы увидеть, были ли у них какие-либо предубеждения в отношении усердия или мягкости в фильмах, которые они рецензировали. Вот как бы вы получили распределение отзывов для каждого рецензента:
SELECT
reviewer.rid,
reviewer.name,
(MAX(rating.stars)-MIN(rating.stars)) AS ratingspread
FROM
reviewer
INNER JOIN rating on reviewer.rid = rating.rid
GROUP BY
reviewer.rid,
reviewer.name
ORDER BY
(MAX(stars)-MIN(stars)) DESC,
reviewer.name
Кстати, причина, по которой вы хотите указать идентификатор, а также название или имя рецензента, состоит в том, чтобы устранить проблемы, когда два фильма имеют одинаковое название, или два рецензента имеют одинаковое имя.