Ruby on Rails以最高价格获得记录

时间:2010-09-27 15:11:51

标签: sql ruby-on-rails activerecord find sql-order-by

我有一个名为Orders的模型Rails模型,它具有type_id,location和price。每种类型可以在同一位置具有不同价格的多个订单。请查看下面的表格结构。

id | type_id | location_id | price
-----------------------------------
1  | 1       | 1           | 12
2  | 1       | 1           | 14
3  | 1       | 1           | 9
4  | 2       | 1           | 1
5  | 2       | 1           | 4
6  | 3       | 1           | 15
7  | 3       | 1           | 7

我基本上想要使用IN示例

按类型选择所有记录
type_ids = "1,2,3"
location_id = 1

Order.find(:all, :conditions => ["location_id = ? and type_id in (?)", location_id, type_ids])

我只想为该位置的每种类型选择价格最高的记录,因此结果集将带回ID为2,5和6的记录。

我似乎无法解决这个问题,我希望你理解我的意思。如果不是,我可以尝试更好地解释。

干杯

EEF

1 个答案:

答案 0 :(得分:2)

如果您只想要条件的单一最高价格,可以使用

Order.find(:first, :conditions => ["location_id = ? and type_id in (?)", location_id, type_ids], :order => 'price DESC')

...因为该查询将从最高价格到最低价格订购匹配记录,然后为您提供第一条记录(最高价格)。

如果你想要每种类型的最高价格项目,你可能会打破Rails的查询构建并使用find_by_sqlget the max(price) for each instance of type_id(类似于SELECT *, MAX(price) FROM orders WHERE location_id = ? AND type_id IN (?) GROUP BY type_id,但是我想对你的数据库运行该查询几次以完善它,我自己)。

除非type_id的数量非常大(例如数百个),否则为每种类型运行上述查询一次并将所有结果放在一个数组中可能更简单; MySQL查询会更快,特别是对于大量type_id s,但在Rails中执行它将是足够好的,除非你决定让MAX(price)查询恰到好处。