gpt4 book ai didi

sql - Rails 4 JOIN GROUP BY 和 SELECT

转载 作者:行者123 更新时间:2023-12-04 19:04:17 25 4
gpt4 key购买 nike

我正在尝试在 Rails 4 中加入 2 个表,以执行计数并保留连接表的一列。

模型:用户 has_many :orders

我想要的是:订单数量和最后一个订单的日期。

has_many :orders, -> { select("users.*, count(orders.id) as orders_count").group('users.id') }

我想像这样选择 ORDERS 表中的 created_at 列
select("users.*, orders.created_at, count(orders.id) as orders_count").group('users.id')

但在那种情况下,我得到一个错误
PG::GroupingError: ERROR:  column "orders.created_at" must appear in the GROUP BY clause or be used in an aggregate function

我需要 FIRST created_at 所以我在 created_at 列上尝试了 SQL 聚合函数“FIRST”
select("users.*, first(orders.created_at) as most_recent, count(orders.id) as orders_count").group('users.id')

但我会得到
PG::UndefinedFunction: ERROR:  function first(character varying) does not exist

知道如何在连接表上实现此 JOIN、COUNT 和 SELECT 吗?

最佳答案

以下对你有用吗?

User.joins(:orders)
.select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count")
.group('users.id')

服用 maxorder.created_at应该给你最近订单的日期。我不认为你想要你的 select作为 has_many 的一部分订单,因为您正在寻找用户列表,而不是订单列表。如果您想要一个返回此事件记录查询的方法,假设您将多次使用它,您可以将以下内容添加到您的 User 中。模型。
def self.with_order_info
self.joins(:orders)
.select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count")
.group('users.id')
end

然后,您可以使用以下方法在任何地方调用该方法:
@users = User.with_order_info

进一步说明(要 100% 清楚),您应该将与订单的关联保持为:
has_many :orders

关于sql - Rails 4 JOIN GROUP BY 和 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com