GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用
本教程将介绍GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我的控制器中有代码按最高平均评论评分对专辑进行排名(使用此解决方案中的代码 怎么通过 has_many 评论关系显示评分最高的专辑):
@albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")
此代码在我的开发环境 (sqlite3) 中运行良好,但是当我将代码推送到 heroku 和 postgresql 时,我收到了这个错误:
PG::GroupingError: ERROR: column "reviews.id" must appear in the GROUP BY clause or be used in an aggregate function
我意识到这是一个相当普遍的问题,我对 SQL 有点缺乏经验,所以我在重构代码时遇到了麻烦,以便它可以在我的开发和生产环境中工作.
推荐答案
不允许选择reviews.id
(通过通配符*
隐式选择)而不添加将其添加到 GROUP BY
子句或应用聚合函数,如 avg()
.解决方案是执行以下操作之一:
从您的选择中删除通配符 *
将字段 reviews.id
添加到您的组子句中
显式选择 reviews.id
并对其应用聚合函数(例如 sum(reviews.id)
)
将通配符 *
替换为特定于表的通配符 albums.*
Remove the wildcard *
from your select
Add the field reviews.id
to your group clause
Select reviews.id
explicitly and apply an aggregate function to it (e.g. sum(reviews.id)
)
Replace the wildcard *
with the table-specific wildcard albums.*
第二个和第三个选项在您的场景中没有多大意义.根据您的评论,我添加了选项四.
好了关于GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。