Неизвестный столбец при использовании псевдонима MySQL

0

Я следую курсу SQL от lagunita.satnford.edu. Я занимаюсь упражнениями на практике, у меня есть три таблицы:

Фильм (mID, название, год, режиссер)

Рецензент (rID, имя)

Рейтинг (rID, mID, stars, ratingDate)

Заявление о проблемах: найдите разницу между средним рейтингом фильмов, выпущенных до 1980 года, и средним рейтингом фильмов, выпущенных после 1980 года. (Не забудьте рассчитать средний рейтинг для каждого фильма, затем среднее значение этих средних для фильмов до 1980 года и фильмы после. Не просто рассчитать общий средний рейтинг до и после 1980 года.) Я написал следующий запрос:

select max(a1) - min(a1) from
(
    select avg(av1) from
        (
            select avg(stars) av1
            from rating join movie m using(mID)
            where year < 1980
            group by mID
        ) as av1
    union
    select avg(av2) from
        (
            select avg(stars) av2
            from rating join movie m using(mID)
            where year > 1980
            group by mID
        ) as av2
) as a1;

Я получаю следующую ошибку: ERROR 1054 (42S22): Unknown column 'a1' in 'field list'

Команды для сбора данных образца:

/* Delete the tables if they already exist */
drop table if exists Movie;
drop table if exists Reviewer;
drop table if exists Rating;

/* Create the schema for our tables */
create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text);
create table Rating(rID int, mID int, stars int, ratingDate date);

/* Populate the tables with our data */
insert into Movie values(101, 'Gone with the Wind', 1939, 'Victor Fleming');
insert into Movie values(102, 'Star Wars', 1977, 'George Lucas');
insert into Movie values(103, 'The Sound of Music', 1965, 'Robert Wise');
insert into Movie values(104, 'E.T.', 1982, 'Steven Spielberg');
insert into Movie values(105, 'Titanic', 1997, 'James Cameron');
insert into Movie values(106, 'Snow White', 1937, null);
insert into Movie values(107, 'Avatar', 2009, 'James Cameron');
insert into Movie values(108, 'Raiders of the Lost Ark', 1981, 'Steven Spielberg');

insert into Reviewer values(201, 'Sarah Martinez');
insert into Reviewer values(202, 'Daniel Lewis');
insert into Reviewer values(203, 'Brittany Harris');
insert into Reviewer values(204, 'Mike Anderson');
insert into Reviewer values(205, 'Chris Jackson');
insert into Reviewer values(206, 'Elizabeth Thomas');
insert into Reviewer values(207, 'James Cameron');
insert into Reviewer values(208, 'Ashley White');

insert into Rating values(201, 101, 2, '2011-01-22');
insert into Rating values(201, 101, 4, '2011-01-27');
insert into Rating values(202, 106, 4, null);
insert into Rating values(203, 103, 2, '2011-01-20');
insert into Rating values(203, 108, 4, '2011-01-12');
insert into Rating values(203, 108, 2, '2011-01-30');
insert into Rating values(204, 101, 3, '2011-01-09');
insert into Rating values(205, 103, 3, '2011-01-27');
insert into Rating values(205, 104, 2, '2011-01-22');
insert into Rating values(205, 108, 4, null);
insert into Rating values(206, 107, 3, '2011-01-15');
insert into Rating values(206, 106, 5, '2011-01-19');
insert into Rating values(207, 107, 5, '2011-01-20');
insert into Rating values(208, 104, 3, '2011-01-02');
  • 0
    Это как говорится. Вы пытаетесь сделать SELECT MAX (a1), но что такое a1 в вашем запросе?
Теги:
alias
subquery

1 ответ

1
Лучший ответ

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

В вашем коде a1 - это имя производной таблицы, а не имя столбца.

Агрегатные функции принимают параметр в терминах имени столбца.

Попробуйте следующее:

select max(av) - min(av) from
(
    select avg(av1) av from
        (
            select avg(stars) av1
            from rating join movie m using(mID)
            where year < 1980
            group by mID
        ) as av1
    union
    select avg(av2) av from
        (
            select avg(stars) av2
            from rating join movie m using(mID)
            where year > 1980
            group by mID
        ) as av2
) as a1; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню