[前][次][番号順一覧][スレッド一覧]

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...      ]