PGError:错误:列“recipes.id”必须出现在 GROUP BY 子句中或在聚合函数中使用

问题描述 投票:0回答:1

我的数据库中有这个 SQL 查询,导致 Heroku 上的 PostgreSQL 出现问题。它导致页面无法加载,并在 Heroku 日志中出现上述错误。我使用的是 PostgreSQL 9.1.6,所以之前的错误显然已得到修复:

def self.top_countries
joins(:recipes).
  select('countries.*, count(*) AS recipes_count').
  group('countries.id').
  order('recipes_count DESC')
end

我该如何重构它才能正常工作?

sql ruby-on-rails-3 postgresql heroku
1个回答
1
投票
def self.top_countries
joins(:recipes).
  select('countries.id, count(*) AS recipes_count').
  group('countries.id').
  order('recipes_count DESC')

这会生成 SQL

select countries.id, count(*) AS recipes_count
  from countries
  join recipes on countries.id = recipes.country_id
 group by countries.id
 order by recipes_count

您会注意到 SELECT 中只有 2 列。
作为一个 Heroku 专家,我怀疑您可以通过明确列出您需要的国家/地区的所有列并按完整列列表进行分组来使其工作,即

def self.top_countries
joins(:recipes).
  select('countries.id, countries.name, countries.other, count(*) AS recipes_count').
  group('countries.id, countries.name, countries.other').
  order('recipes_count DESC')

可能有一种更简洁的方法将原始答案(顶部)与

top_countries
上的
countries.id
的另一个连接连接起来,以获取
group by
之后的其余列。

© www.soinside.com 2019 - 2024. All rights reserved.