Что делает эту разницу при использовании group by или join? - PullRequest
0 голосов
/ 13 апреля 2020

Кто-нибудь может сказать разницу между ними? 1-й и 3-й запрос могут быть успешно выполнены, и они имеют одинаковый вывод. Хотя 2-й и 4-й запросы не могут быть выполнены, и они оба вызвали ОШИБКУ:

столбец "mov ie .title" должен появляться в предложении GROUP BY или использоваться в статистической функции LINE. 1: ВЫБЕРИТЕ заголовок, (МАКС. (Звездочки) -МИН (звездочки)) КАК РАСПРЕДЕЛЕНИЕ.

Мои вопросы:

  1. почему использование m.mid отличается от r .mid при использовании group by (запрос 1 против запроса 2)
  2. , почему внутреннее соединение B не равно B внутреннему соединению A (запрос 3 против запроса 4)
    SELECT title, (MAX(stars)-MIN(stars)) AS ratingspread
    FROM rating r JOIN movie m
    ON r.mid = m.mid
    GROUP BY m.mid
    ORDER BY ratingspread DESC, title;

    SELECT title, (MAX(stars)-MIN(stars)) AS ratingspread
    FROM rating r JOIN movie m
    ON r.mid = m.mid
    GROUP BY r.mid
    ORDER BY ratingspread DESC, title;

    SELECT title, (MAX(stars) - MIN(stars)) AS ratingspread
    FROM movie
    INNER JOIN rating USING(mId)
    GROUP BY mId
    ORDER BY rating_spread DESC, title;

    SELECT title, (MAX(stars)-MIN(stars)) AS ratingspread
    FROM rating 
    INNER JOIN movie USING(mId)
    GROUP BY mId
    ORDER BY ratingspread DESC, title

К вашему сведению схема выглядит следующим образом:

Mov ie (mID, название, год, директор) Существует mov ie с идентификационным номером mID, названием, годом выпуска и директором.

Рецензент (rID, имя) Рецензент с идентификационным номером rID имеет определенное имя.

Рейтинг (rID, mID, звезды, ratingDate) RID рецензента дал mov ie mID a количество звездочек рейтинга (1-5) по определенному рейтингу даты.

1 Ответ

0 голосов
/ 13 апреля 2020

Ваши запросы не дают того, что вы думаете, они производят по ряду причин.

Вот то, что вы действительно ищете, я думаю:

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

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

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