rails:3472
From: naopontan <naopontan@g...>
Date: Thu, 26 Aug 2010 11:41:00 +0900
Subject: [rails:3472] Re: has_one の検索について
naopontan です。 > Order.find(:all, :group => :customer_id, :having => 'MAX(created_at)') でしょうか。 出来ました!スピードも半分ぐらい短縮です。(クラス名が違うのは御愛嬌) $ time ruby script/runner "Bill.all(:group => :user_id, :having => 'MAX(created_at)').size" real 0m2.999s user 0m1.852s sys 0m0.424s $ time ruby script/runner "User.all.find_all{|u| u.bill}.map{|u| u.bill}.size" real 0m4.998s user 0m3.620s sys 0m0.448s > 1つもオーダーしていないカスタマーに対してnilを返すためにはOUTER JOINを使う必要がありそうなのですが、 > sqlite3で試したら未サポート… 1つもオーダーしていないカスタマーは不要なので大丈夫です。 > ↓SQL的にはこうなるんでしょうか。 > > SELECT * FROM ( > SELECT * FROM orders GROUP BY customer_id HAVING MAX(created_at) > ) AS latest_orders_by_customer > WHERE cost > 500; > > ↓こうじゃないですよね。 > > SELECT * FROM orders WHERE cost > 500 GROUP BY customer_id HAVING > MAX(created_at); 結果的には同じになりませんか? ちなみに後者のSQLの方が断然早いですね。 実験してみたら以下の様になりました。 前者⇒(1,132 合計, クエリの実行時間 0.0609 秒) 後者⇒(1,132 合計, クエリの実行時間 0.0014 秒) 一応、 > Order.find(:all, :group => :customer_id, :having => 'MAX(created_at)') が分かっただけでも前進できて満足しています。 2010年8月25日21:27 OZAWA Sakuro <sakuro@2...>: > さくです。 > > > 2010/8/25 OZAWA Sakuro <sakuro@2...>: > >>> Q2:以下で検索対象を「最新の注文」に限定するにはどう記述すれば良いですか? >>> Customer.all(:include => "order", :conditions => ["orders.cost > ?", 500]) >> >> 挑戦中。 > > ↓SQL的にはこうなるんでしょうか。 > > SELECT * FROM ( > SELECT * FROM orders GROUP BY customer_id HAVING MAX(created_at) > ) AS latest_orders_by_customer > WHERE cost > 500; > > ↓こうじゃないですよね。 > > SELECT * FROM orders WHERE cost > 500 GROUP BY customer_id HAVING > MAX(created_at); > > -- > OZAWA Sakuro > > "The future will be better tomorrow." --Dan Quayle > > -- > ML: rails@r... > 使い方: http://QuickML.com/ > -- ML: rails@r... 使い方: http://QuickML.com/
3465 2010-08-25 04:54 [naopontan@g... ] has_one の検索について 3466 2010-08-25 11:57 ┗[sakuro@2... ] 3467 2010-08-25 14:27 ┗[sakuro@2... ] -> 3472 2010-08-26 04:41 ┗[naopontan@g... ]