我想在PostgreSQL中随机选择一行,我试过这个:
select * from table where random() < 0.01;
Run Code Online (Sandbox Code Playgroud)
但其他一些人推荐这个:
select * from table order by random() limit 1000;
Run Code Online (Sandbox Code Playgroud)
我有一个非常大的表,有5亿行,我希望它快.
哪种方法更好?有什么区别?选择随机行的最佳方法是什么?
所以,我发现了几个在Rails 2中查找随机记录的例子 - 首选方法似乎是:
Thing.find :first, :offset => rand(Thing.count)
Run Code Online (Sandbox Code Playgroud)
作为一个新手,我不知道如何使用Rails 3中的新查找语法来构造它.
那么,找到随机记录的"Rails 3 Way"是什么?
我想让我的数组项目混乱.像这样的东西:
[1,2,3,4].scramble => [2,1,3,4]
[1,2,3,4].scramble => [3,1,2,4]
[1,2,3,4].scramble => [4,2,3,1]
Run Code Online (Sandbox Code Playgroud)
等等,随机
我在postgres中有一个包含数百万行的表.我在网上查了一下,发现了以下内容
SELECT myid FROM mytable ORDER BY RANDOM() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
它工作,但它真的很慢......是否有另一种方式来进行查询,或者直接选择随机行而不读取所有表格?顺便说一下'myid'是一个整数,但它可以是一个空字段.
谢谢
到目前为止,从数据库获取随机记录的"常见"方法是:
# Postgress
Model.order("RANDOM()").first
# MySQL
Model.order("RAND()").first
Run Code Online (Sandbox Code Playgroud)
但是,在Rails 5.2中执行此操作时,它会显示以下Deprecation警告:
DEPRECATION WARNING:使用非属性参数调用的危险查询方法(其参数用作原始SQL的方法):"RANDOM()".Rails 6.0中不允许使用非属性参数.不应使用用户提供的值调用此方法,例如请求参数或模型属性.可以通过将它们包装在Arel.sql()中来传递已知安全值.
我对Arel并不熟悉,所以我不确定解决这个问题的正确方法是什么.
ruby-on-rails rails-activerecord deprecation-warning ruby-on-rails-5.2