2013-06-04 52 views
1

我有像模特這樣(軌道2)MySQL的限制線與GROUP BY操作

MyModel : 
- id 
- category_id 
- value 
- my_model_count 

我想通過自己的類別,以獲得10個第一mymodels,組。

這是可能的:

all_mymodels = MyModel.find(:all, :order => 'my_model_count') 
grouped_mymodels = all_mymodels.group_by(&:category_id) 
grouped_mymodels.map do|gmm| 
    gmm[0...10] 
end 

的問題是,所有的爲MyModel線被查詢返回的;現在,有超過8000行。

是否有任何方法(在滑軌或MySQL)做的每組10行此限制?

問候

回答

0

我不認爲這是一個簡單的單個查詢解決方案,你在找什麼,但根據您的數據大小,你知道了有關領域的前沿是什麼有幾個選項。

首先,您可以使用find_each來代替它,它仍然會遍歷整個集合,但它可以避免將所有8000加載到內存中。這看起來像這樣:

grouped_mymodels = {} 
all_mymodels = MyModel.find_each do |model| 
    grouped_models[model.category_id] ||= [] 
    next if grouped_models[model.category_id] > 10 
    grouped_models[model.category_id] << model 
end 

否則,我認爲你需要運行多個查找操作來獲得每個類別的前十名記錄。

如果您只需要模型中的某些數據,您可以使用GROUP_CONCAT或其他東西來查看它。