Rails PG GroupingError 列必须出现在 GROUP BY 子句中
Rails PG GroupingError column must appear in the GROUP BY clause
关于这个的一些主题已经有了公认的答案,但我无法根据这些找到解决方案:
例如:
- Ruby on Rails: must appear in the GROUP BY clause or be used in an aggregate function
- GroupingError: ERROR: column must appear in the GROUP BY clause or be used in an aggregate function
- PGError: ERROR: column "p.name" must appear in the GROUP BY clause or be used in an aggregate function
我的查询是:
Idea.unscoped.joins('inner join likes on ideas.id = likes.likeable_id').
select('likes.id, COUNT(*) AS like_count, ideas.id, ideas.title, ideas.intro, likeable_id').
group('likeable_id').
order('like_count DESC')
这在使用 sqlite 进行开发时很好,但在使用 PostgreSQL 的 heroku 上会中断。
错误是:
PG::GroupingError: ERROR: column "likes.id" must appear in the GROUP BY clause or be used in an aggregate function
如果我将 likes.id 放入我的组中,那么结果将毫无意义。试图将组放在 select 之前,但没有帮助。我什至试图将查询分为两部分。没有快乐。 :(
任何建议表示赞赏。 TIA!
我不知道你为什么要 select likes.id
首先。我看到您基本上想要每个想法的 like_count
;我看不出 selecting likes.id
有什么意义。此外,当您已经拥有 ideas.id
时,我不明白您为什么想要获得 likes.likeable_id
的值,因为它们是相等的。 :/
无论如何,问题是因为你按 likeable_id
分组(基本上是 ideas.id
),你不能 "select" likes.id
因为它们会是 "lost"按分组。
我想 SQLite 对此很松懈。我想它不会正确地分组。
无论如何(2) =>
让我提出一个更清洁的解决方案。
# model
class Idea < ActiveRecord::Base
# to save you the effort of specifying the join-conditions
has_many :likes, foreign_key: :likeable_id
end
# in your code elsewhere
ideas = \
Idea.
joins(:likes).
group("ideas.id").
select("COUNT(likes.id) AS like_count, ideas.id, ideas.title, ideas.intro").
order("like_count DESC")
如果你还想获取每个项目的点赞ID,那么在上面之后,你可以这样做:
grouped_like_ids = \
Like.
select(:id, :likeable_id).
each_with_object({}) do |like, hash|
(hash[like.likeable_id] ||= []) << like.id
end
ideas.each do |idea|
# selected previously:
idea.like_count
idea.id
idea.title
idea.intro
# from the hash
like_ids = grouped_like_ids[idea.id] || []
end
其他读者:我对 "clean" 单查询非子查询解决方案非常感兴趣。如果您留下回复,请在评论中告诉我。谢谢。
关于这个的一些主题已经有了公认的答案,但我无法根据这些找到解决方案: 例如:
- Ruby on Rails: must appear in the GROUP BY clause or be used in an aggregate function
- GroupingError: ERROR: column must appear in the GROUP BY clause or be used in an aggregate function
- PGError: ERROR: column "p.name" must appear in the GROUP BY clause or be used in an aggregate function
我的查询是:
Idea.unscoped.joins('inner join likes on ideas.id = likes.likeable_id').
select('likes.id, COUNT(*) AS like_count, ideas.id, ideas.title, ideas.intro, likeable_id').
group('likeable_id').
order('like_count DESC')
这在使用 sqlite 进行开发时很好,但在使用 PostgreSQL 的 heroku 上会中断。
错误是:
PG::GroupingError: ERROR: column "likes.id" must appear in the GROUP BY clause or be used in an aggregate function
如果我将 likes.id 放入我的组中,那么结果将毫无意义。试图将组放在 select 之前,但没有帮助。我什至试图将查询分为两部分。没有快乐。 :(
任何建议表示赞赏。 TIA!
我不知道你为什么要 select likes.id
首先。我看到您基本上想要每个想法的 like_count
;我看不出 selecting likes.id
有什么意义。此外,当您已经拥有 ideas.id
时,我不明白您为什么想要获得 likes.likeable_id
的值,因为它们是相等的。 :/
无论如何,问题是因为你按 likeable_id
分组(基本上是 ideas.id
),你不能 "select" likes.id
因为它们会是 "lost"按分组。
我想 SQLite 对此很松懈。我想它不会正确地分组。
无论如何(2) =>
让我提出一个更清洁的解决方案。
# model
class Idea < ActiveRecord::Base
# to save you the effort of specifying the join-conditions
has_many :likes, foreign_key: :likeable_id
end
# in your code elsewhere
ideas = \
Idea.
joins(:likes).
group("ideas.id").
select("COUNT(likes.id) AS like_count, ideas.id, ideas.title, ideas.intro").
order("like_count DESC")
如果你还想获取每个项目的点赞ID,那么在上面之后,你可以这样做:
grouped_like_ids = \
Like.
select(:id, :likeable_id).
each_with_object({}) do |like, hash|
(hash[like.likeable_id] ||= []) << like.id
end
ideas.each do |idea|
# selected previously:
idea.like_count
idea.id
idea.title
idea.intro
# from the hash
like_ids = grouped_like_ids[idea.id] || []
end
其他读者:我对 "clean" 单查询非子查询解决方案非常感兴趣。如果您留下回复,请在评论中告诉我。谢谢。