@ellz

Почему появляется ошибка «column must appear in the GROUP BY clause or be used in an aggregate function»?

Есть две таблицы:
images:
create table images
(
  id        serial      not null
    constraint images_pk
      primary key,
  image_url varchar(60) not null,
  autor_id  integer     not null,
  views     integer,
  rating    numeric
);

и votes:
create table votes
(
  id       serial  not null
    constraint votes_pk
      primary key,
  image_id integer not null,
  user_id  integer not null,
  value    integer not null
);

и вот такой запрос:
select image_url, (select avg(votes.value))
                from images
                      inner join votes on votes.image_id = images.id
                group by image_url
                order by views asc

Который должен вытащить ссылку к изображению и его средний рейтинг из таблицы votes. Поскольку в таблице с голосами image_url повторяется - сделал group by image_url, но получаю ошибку
column "images.views" must appear in the GROUP BY clause or be used in an aggregate function
. В чем может быть проблема?
Пробовал установить в gprup by разные значения, но ошибка все равно остается, только поле в ней меняется. Например:
group by images.views-column "images.image_url" must appear in the GROUP BY clause or be used in an aggregate function
  • Вопрос задан
  • 20164 просмотра
Решения вопроса 2
LaRN
@LaRN
Senior Developer
Поле по которому происходит группировка image_url, поле которое агрегируется votes.value, а поле views ни там, ни там.
Нужно добавить поле views в секцию group by:
group by image_url, views , например так:
select views, image_url, (select avg(votes.value))
  from images
 inner join votes 
     on votes.image_id = images.id
 group by views, image_url
 order by views asc


Либо в секцию order by поставить поле image_url.
Ответ написан
NeiroNx
@NeiroNx
Программист
Эта ошибка связана с
...
order by views asc


попробуйте
...
order by sum(views) asc
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AnatolTh
@AnatolTh
Full Stack Developer
select 
   image_url, 
   avg(votes.value) as myavg
from images

inner join votes on votes.image_id = images.id
group by image_url
order by myavg asc
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы