GroupingError:ERROR:列必须出现在GROUP BY子句中或用于聚合函数

Reu*_*ben 29 sqlite postgresql activerecord ruby-on-rails ruby-on-rails-4

我的控制器中的代码是按照最高的平均评价等级对相册进行排名(使用此解决方案中的代码如何通过has_many评论关系显示评分最高的专辑):

@albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")
Run Code Online (Sandbox Code Playgroud)

这段代码在我的开发环境(sqlite3)中完美运行,但是当我将代码推送到heroku和postgresql时,我遇到了这个错误:

PG::GroupingError: ERROR:  column "reviews.id" must appear in the GROUP BY clause or be used in an aggregate function
Run Code Online (Sandbox Code Playgroud)

我意识到这是一个相当普遍的问题,我对SQL有点缺乏经验,因此我无法重构代码,因此它可以在我的开发和生产环境中工作.

sla*_*ash 32

您不允许选择reviews.id(通过通配符隐式选择*)而不将其添加到GROUP BY子句或应用聚合函数avg().解决方案是执行以下操作之一:

  1. *从您的选择中删除通配符
  2. 将该字段添加reviews.id到您的组子句中
  3. reviews.id明确选择并对其应用聚合函数(例如sum(reviews.id))
  4. 将通配符替换为*特定于表的通配符albums.*

第二个和第三个选项在你的场景中没有多大意义.根据您的评论,我添加了选项四.