2010-06-30 99 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