12

これは、「タイプ」、「品種」、および「価格」属性を持つテーブルが与えられた場合に、存在する各タイプの最低価格でレコードを取得するという古くからの質問です。

SQL では、次の方法でこれを行うことができます。

select f.type, f.variety, f.price   
from (  select type, min(price) as minprice from table group by type ) as x  
inner join table as f on f.type = x.type and f.price = x.minprice;`

おそらくこれを次のように模倣できます。

minprices = Table.minimum(:price, :group => type)  
result = []
minprices.each_pair do |t, p|  
   result << Table.find(:first, :conditions => ["type = ? and price = ?", t, p])
end

これよりも優れた実装はありますか?

4

6 に答える 6

13
Table.minimum(:price, :group => :type)

詳細については、 http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-minimumを参照してください。

于 2008-10-09T01:55:01.760 に答える
1

私はしばらくこれと戦ってきましたが、今のところ、SQL の生成にかなり行き詰まっているようです。

ただし、提供する改良点がいくつかあります。

の代わりにfind_by_sql、@François が提案したように、ActiveRecord のto_sqlandjoinsを使用して、SQL を少し「ガイド」しました。

subquery_sql = Table.select(["MIN(price) as price", :type]).group(:type).to_sql
joins_sql    = "INNER JOIN (#{subquery_sql}) as S
                ON table.type = S.type
                AND table.price = S.price"

Table.joins(joins_sql).where(<other conditions>).order(<your order>)

ご覧のとおり、私はまだ生の SQL を使用していますが、少なくともそれは AR がサポートしていない部分 (私の知る限り ActiveRecord は単に管理できないINNER JOIN ... ON ...) だけであり、全体ではありません。

find_by_sqljoinsの代わりに使用すると、クエリが連鎖可能になります。条件を追加したり、テーブルを並べ替えたり、すべてをスコープに入れたりできます。

于 2013-02-14T18:45:26.333 に答える
1

# を使用できますfind_by_sqlが、これはモデル オブジェクトを返すことを意味し、これは望んでいない可能性があります。

金属にむき出しにしたい場合は、 # も使用できますselect_values

data = ActiveRecord::Base.connection.select_values("
        SELECT f.type, f.variety, f.price
        FROM (SELECT type, MIN(price) AS minprice FROM table GROUP BY type ) AS x
        INNER JOIN table AS f ON f.type = x.type AND f.price = x.minprice")
puts data.inspect
[["type", "variety", 0.00]]

ActiveRecord は単なるツールです。都合のいいときに使います。SQL の方が優れている場合は、SQL を使用します。

于 2008-10-09T07:06:57.947 に答える
-1

上記のAvdiの回答を更新するには:

Table.minimum(:価格, :グループ => :タイプ)

更新された URL は次のとおりです。

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-minimum

于 2014-06-10T08:03:18.460 に答える