2014-02-05 58 views
0

如何根據某些訂單子句選擇表的最前N%行?希望只有一個數據庫查詢從ActiveRecord的查詢中選擇最高N%,Rails

this discussion,以下是從PostgreSQL的選擇從表中的前10%行的方式:

SELECT * FROM mytbl ORDER BY num_sales DESC LIMIT 
    (SELECT (count(*)/10) AS selnum FROM mytbl) 

this answer,中嵌套一個查詢其中的ActiveRecord子句將產生一個嵌套的SELECT,而不是射擊兩個查詢:

Item.where(product_id: Product.where(price: 50)) 

怎麼能像這樣在ActiveRecord的完成,無需太多的SQL?

+0

用'find_by_sql'什麼問題嗎? –

+0

我希望得到一個ActiveRecord解決方案,因爲SQL可以變得非常難看,我想在範圍中使用它 – Nicolas

+0

也許將SQL傳遞給limit()方法不會那麼糟糕,但這不是顯而易見的 – Nicolas

回答

1

它不會是非常低效的做到這一點:

total_rows = MyClass.count 
limit_rows = (0.1 * total_rows).to_i 
MyClass.order("num_sales desc").limit(limit_rows) 

當然還是:

MyClass.order("num_sales desc").limit((0.1 * MyClass.count).to_i) 
+0

謝謝,但我的意思是一個查詢。這是一個關鍵的請求和一個巨大的表,因此在一個查詢中完成所有操作非常重要。我在這個問題上加了這個。 – Nicolas

+0

這種方法沒有太多的低效率,除了執行兩個查詢而不是一個。這個開銷很小,因爲你只是選擇了一個值,然後直接返回。在「選擇一個巨大表格的有序10%」查詢的情況下,它將變得微不足道。 –