GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

本教程将介绍GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用 教程 第1张

问题描述

我的控制器中有代码按最高平均评论评分对专辑进行排名(使用此解决方案中的代码 怎么通过 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 子句中或在聚合函数中使用的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。