我想要做一個查詢,我選擇了一堆數據,但我希望能夠通過只選擇,然後減少數據的分辨率,每三分鐘一次,甚至每一百分鐘,或者其他任何事情。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