我想要做一个查询,我选择了一堆数据,但我希望能够通过只选择,然后减少数据的分辨率,每三分钟一次,甚至每一百分钟,或者其他任何事情。ActiveRecord查找 - 跳过记录或获取每第N个记录
是否有任何直接的方法来做到这一点与ActiveRecord?
我想要做一个查询,我选择了一堆数据,但我希望能够通过只选择,然后减少数据的分辨率,每三分钟一次,甚至每一百分钟,或者其他任何事情。ActiveRecord查找 - 跳过记录或获取每第N个记录
是否有任何直接的方法来做到这一点与ActiveRecord?
在Oracle中,我会写如下:
YourModel.find(:conditions => 'MOD(ROWNUM,3) = 0')
这具有过滤器发生在数据库的优点,所以并不是所有东西都被检索到。
在PostgreSQL中,这被称为ROW_NUMBER
(实际上这是SQL标准)。在MySQL中不支持。
在mysql中,你可以使用SELECT @rownum:[email protected]+1 rownum, t.* FROM (SELECT @rownum:=0) r, mytable t;
来模仿rownum。所以我想像
Bar.find_by_sql("select * from (SELECT @rownum:[email protected]+1 rownum, t.* FROM (SELECT @rownum:=0) r, mytable t) where mod(rownum,3) = 0")
应该工作。
如果模型有一个上升列像id
不会错过任何号码,你可以做这样的事情:
Model.all(:condition => "models.id%3=0")
如果没有,你可以先获取数据库中的所有行,然后你可以这样做:
models = Model.all
third_models = models.reject{ |model| models.index(model) % 3 != 0 }
会有很多数据,所以第二种方法并不是真正可行的。第一个*可能*是可以的,并且是我想到的,但实际上我可能会尝试做的是在此模型上有一个自动填充的rowcount列,并在其上使用MOD方法。 – 2010-06-30 10:45:59
不幸的是我在这里使用MySQL。 – 2010-06-30 10:44:59
在mysql中,你可以使用'SELECT @rownum:= @ rownum + 1 rownum,t。* FROM(SELECT @rownum:= 0)r,mytable t;'来模拟rownum。所以我想''Bar.find_by_sql(“select * from(SELECT @rownum:= @ rownum + 1 rownum,t。* FROM(SELECT @rownum:= 0)r,mytable t)其中mod(rownum,3) = 0“)'可能工作? – nathanvda 2010-06-30 11:07:02
是的,我认为这是迄今为止最好的方法。在我的场景中,我使用的查找器的范围与父记录有关,但是稍微改写一下您的建议就很合适。谢谢! 你想把它作为一个单独的答案添加,我会接受吗? – 2010-06-30 11:31:45