Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails 4连接分组方式并选择_Sql_Ruby On Rails_Join - Fatal编程技术网

Sql Rails 4连接分组方式并选择

Sql Rails 4连接分组方式并选择,sql,ruby-on-rails,join,Sql,Ruby On Rails,Join,我正在尝试连接Rails 4中的两个表,以执行计数并保留连接表的一列 型号:用户有多个:订单 我想要的是:订单数量和上次订单的日期 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

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

型号:用户有多个:订单

我想要的是:订单数量和上次订单的日期

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
我需要第一个在处创建的_,所以我在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

你知道我如何实现这个连接,在连接的表上进行计数和选择吗?

下面的步骤对你有用吗

User.joins(:orders)
    .select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count")
    .group('users.id')
获取
订单的
max
。在
创建的\u应提供最近订单的日期。我认为你不想让你的
选择
作为
有许多
订单的一部分,因为你要的是用户列表,而不是订单列表。如果您想要一个返回此活动记录查询的方法,假设您将多次使用它,则可以将以下内容添加到您的
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

你能发布你的关系模型并准确描述你想要什么吗?您想要每个用户的订单数量吗?只需编辑question@stefano_cdn,您使用的是哪个版本的PostgreSQL?因此,我认为您需要
,类名称:“Users”
,位于范围块之后。但我可能会生气……你仍然需要做另一个查询来获取@stefano_cdn正在寻找的信息。@jcunod来获取什么信息?我不知道你的意思。据我所知,我的答案捕获了OP正在寻找的所有信息。我还稍微修改了我的答案(因为
select
不应该是
has\u many:orders
关联的一部分)。Thx@JoeKennedy,我还计划在has\u many:through关系中使用select来获取关系表的列。在这里,您的答案很好,如果您想要分组并保留一个不是日期而是字符串的列,该怎么办:您不能使用MAX函数,但是否有一个聚合函数可以保留这些列而不进行任何操作(正如我在最初的问题中提到的,我尝试了第一次和最后一次,但都不起作用)如果
max
对字符串不起作用,那么我不确定是否有一个聚合函数可以起作用。可能需要一个嵌套查询。