2011-08-20 21 views
51

このクエリ"group by"の結果の "順序"?

Message.where("message_type = ?", "incoming").group("sender_number").count 

は私のハッシュを返します。

OrderedHash {"1234"=>21, "2345"=>11, "3456"=>63, "4568"=>100} 

今、私は各グループのカウントで注文したいと思います。どのようにしてクエリ内でそれを行うことができますか?

答えて

82

これを行う最も簡単な方法は、元のクエリに注文句を追加することです。あなたがカウント方法に特定のフィールドを与える場合は、注文の呼び出しを追加することによって生成されたSQLで使用することができ、名前のcount_ {列}と出力列を生成します。

Message.where('message_type = ?','incoming') 
     .group('sender_number') 
     .order('count_id asc').count('id') 
+1

いいえ、それは私のために働いていません.. –

+1

どのデータベースエンジンを使用していますか?どのバージョンのレール、そして生成されたSQLは何ですか?私はレール3.0.7でうまく動作するテストケース(別のモデル)を得ました。 ( 'price_date).order(' count_price asc ')。count(' price ') 'これは' SELECT COUNT( "prices"。 "price"を生成します。 ")AS count_price、price_date AS price_date FROM" prices "WHERE(価格はnullではありません)GROUP BY price_date ORDER BY count_price asc' –

+0

ありがとうございます。これは私が前にそれをやっていた方法と比較して、私の質問からずっと時間を節約しました!最も重要なレッスン:countメソッドが 'count_ {column}'という名前の出力列を生成することがわかった!ありがとうございました! – Yavin4

13

私はこれを試したときは、レールは、それがSELECTは... AS count_all

は、だから私はこのように見えるようにサイモンの答え@からクエリを更新言うこと

SQLite3::SQLException: no such column: count_id: SELECT COUNT(*) AS count_all, state AS state FROM "ideas" GROUP BY state ORDER BY count_id desc LIMIT 3 

お知らせ私は、このエラーを与え、それは私

のために働きます
+0

どのARバージョンで' count_id'の代わりに 'count_all'を使いますが、4.2.1では' .order( "count_id desc") 'が動作します。 – sameers

+0

私のために働く。多分あなたは.count( 'id')を見逃したでしょうか? – mahemoff

関連する問題