带有GROUP BY操作数的mysql LIMIT行

时间:2013-06-04 13:21:20

标签: mysql ruby-on-rails-2

我有一个这样的模型(Rails 2)

MyModel :
- id
- category_id
- value
- my_model_count

我希望获得10个第一个mymodel,按类别分组。

可以:

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行。

是否有任何方法(在Rails或mySQL中)为每组10行进行此限制?

此致

1 个答案:

答案 0 :(得分:0)

我认为没有一个简单的单一查询解决方案可以满足您的需求,但根据您的数据大小以及您对该领域的了解,有几个选项。

首先,您可以使用find_each代替仍然会遍历整个集合的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或其他东西来为你推送它。