Sql 我如何随机获得特定数量的记录,比如说100条,然后按rails中DESC创建的记录排序?

Sql 我如何随机获得特定数量的记录,比如说100条,然后按rails中DESC创建的记录排序?,sql,ruby-on-rails,ruby,Sql,Ruby On Rails,Ruby,我试过以下方法: products=Product.order(“RANDOM()”).limit(100).order(“在描述时创建”) 但这并不是按顺序创建的。相反,它仍然是随机的。我还知道,这可以通过将活动记录集合转换为数组,然后对其进行排序来实现,但为了提高速度,我不希望这样做。如果要在数据库中实现,则可以使用派生表: Product.from(Product.order(Arel.sql('random()')).limit(100), :products) .orde

我试过以下方法:

products=Product.order(“RANDOM()”).limit(100).order(“在描述时创建”)


但这并不是按顺序创建的。相反,它仍然是随机的。我还知道,这可以通过将活动记录集合转换为数组,然后对其进行排序来实现,但为了提高速度,我不希望这样做。

如果要在数据库中实现,则可以使用派生表:

Product.from(Product.order(Arel.sql('random()')).limit(100), :products)
       .order(created_at: :desc)
将使用以下SQL(或多或少):

select products.*
from (
    select products.*
    from products
    order by random()
    limit 100
) products
order by created_at desc
select products.*
from products
where id in (
    select id
    from products
    order by random()
    limit 100
)
order by created_at desc
您需要将第二个
:products
参数添加到
#from
以使
Product
模型确信派生表与
products
表具有相同的结构

或者,您可以使用子查询:

Product.where(id: Product.order(Arel.sql('random()')).limit(100))
       .order(created_at: :desc)
将使用如下SQL:

select products.*
from (
    select products.*
    from products
    order by random()
    limit 100
) products
order by created_at desc
select products.*
from products
where id in (
    select id
    from products
    order by random()
    limit 100
)
order by created_at desc
结果将与派生表版本相同,但子查询往往较慢;当然,如果您担心性能,最好检查查询计划


它们都会抓取您的100个随机行,然后通过在处创建的
对这些随机行进行排序。我可能会选择第一个版本,但是对于
limit 100
,性能差异可能更多地取决于如何处理
order by random()limit 100
,而不是派生表与子查询。

.reorder(“created_at DESC”)
是您要寻找的。否则,它将在第一个子句之后使用第二个order by。@dbugger But
#reorder
complete替换已经存在的
order by
子句。reorder('created_at desc')
将丢弃
.order('random()')
。可能需要在两条语句中执行此操作——抓取随机记录并对其重新排序set@dbugger或者使用派生表或子查询获取100条随机记录。非常感谢!我现在将对“阿雷尔”进行更多的研究。再次感谢。小心使用AREL,使用IMO可能会很麻烦。我在这里使用
AREL.sql(“…”)
,因为较新版本的ActiveRecord会抱怨传递给某些方法的字符串,所以需要使用
AREL.sql('random()')
之类的东西来避免嘈杂的弃用警告。