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()')
之类的东西来避免嘈杂的弃用警告。