我正在使用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编写它。
答案 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
。但是由于foo2
和foo3
共享相同的created_at
,因此将返回所有三个记录。
一种更好的选择记录的方法是(对于Postgres):
Foo.select('DISTINCT ON ("user_id") *').order(:user_id, created_at: :asc)