如何使用ActiveRecord编写此MySQL查询

时间:2018-11-23 21:12:48

标签: ruby-on-rails ruby-on-rails-5

我正在使用Rails 5项目,并且有一个类似于以下内容的SQL查询:

SELECT foo1.* 
 FROM foos foo1 
 WHERE foo1.created_at = 
   ( SELECT MIN(foo2.created_at) FROM foos foo2 WHERE foo2.user_id = foo1.user_id );

此处的模型名为Foo,基础表名为foos。我想编写一种方法,该方法将基本上为每个user_id给我一条记录,并提供最早的created_at时间戳,上述SQL查询将解决该时间戳。我只想使用ActiveRecord编写它。

1 个答案:

答案 0 :(得分:0)

您拥有的初始查询不一定每个user_id都给您一条记录。

这是一个例子:

# created_at1 < created_at2
foo1 = Foo.create!(user_id: 1, created_at: created_at1)
foo2 = Foo.create!(user_id: 1, created_at: created_at2)
foo3 = Foo.create!(user_id: 2, created_at: created_at2)

您的查询将为每个created_at选择最小值user_id,因此它将从created_at1获得foo1,并从created_at2获得foo3。但是由于foo2foo3共享相同的created_at,因此将返回所有三个记录。

一种更好的选择记录的方法是(对于Postgres):

Foo.select('DISTINCT ON ("user_id") *').order(:user_id, created_at: :asc)