2010-06-30 120 views

回答

1

在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") 

应该工作。

+0

不幸的是我在这里使用MySQL。 – 2010-06-30 10:44:59

+0

在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

+0

是的,我认为这是迄今为止最好的方法。在我的场景中,我使用的查找器的范围与父记录有关,但是稍微改写一下您的建议就很合适。谢谢! 你想把它作为一个单独的答案添加,我会接受吗? – 2010-06-30 11:31:45

4

如果模型有一个上升列像id不会错过任何号码,你可以做这样的事情:

Model.all(:condition => "models.id%3=0") 

如果没有,你可以先获取数据库中的所有行,然后你可以这样做:

models = Model.all 
third_models = models.reject{ |model| models.index(model) % 3 != 0 } 
+0

会有很多数据,所以第二种方法并不是真正可行的。第一个*可能*是可以的,并且是我想到的,但实际上我可能会尝试做的是在此模型上有一个自动填充的rowcount列,并在其上使用MOD方法。 – 2010-06-30 10:45:59