【发布时间】:2017-10-18 21:06:09
【问题描述】:
我有场地,场地有很多物品。我想获得每个场地的最新项目。要在单个查询中返回每个场地的最新项目,我可以将 max 聚合函数与 group by 一起使用:
class Item < ActiveRecord::Base
scope :newest_items, -> (venue_ids) {
select('max(items.id) as id, venue_id').joins(:venue).where('venues.id IN (?)', venue_ids).group(:venue_id)
}
end
生成的sql:
Item.newest_items(Venue.pluck(:id)).to_sql
=> "SELECT max(items.id) as id, venue_id FROM \"items\"
INNER JOIN \"venues\" ON \"venues\".\"id\" = \"items\".\"venue_id\"
WHERE (venues.id IN (1,2,3))
GROUP BY \"items\".\"venue_id\""
所以我有每个场地的最新项目。但是有了这个结果,我想按创建日期对结果进行排序。
如果我有一个 order by 子句:
class Item < ActiveRecord::Base
scope :newest_items, -> (venue_ids) {
select('max(items.id) as id, venue_id')
.joins(:venue).where('venues.id IN (?)', venue_ids)
.group(:venue_id).order('items.created_at desc')
}
end
sql:
Item.close_by_items(Venue.pluck(:id)).to_sql
=> "SELECT max(items.id) as id, venue_id
FROM \"items\" INNER JOIN \"venues\" ON \"venues\".\"id\" = \"items\".\"venue_id\"
WHERE (venues.id IN (1,2,3))
GROUP BY \"items\".\"venue_id\"
ORDER BY items.created_at desc"
我得到错误:
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "items.created_at" 必须出现在 GROUP BY 子句中或用于聚合函数中
为什么 created_at 必须出现在 GROUP BY 子句中或在聚合函数中使用?我要做的就是按 created_at 时间对 group by 子句的结果进行排序。
【问题讨论】:
-
你不能
order by一个未被选中的列。 -
@vkp 即使添加到select语句中,错误也是一样的:列“items.created_at”必须出现在GROUP BY子句中或者在聚合函数中使用
-
是的..如果你不聚合它,它应该在
group by。 -
@vkp 为什么?我不明白为什么在 group by 中需要它。我正在尝试对分组结果进行排序。
标签: sql ruby-on-rails postgresql