4

この疑似クエリを考えると:

Model.sum(:column, :condition => ['id = ?', id], order => "date DESC", :limit => X)

ここで、取得された合計が値Xによって「制限」されないという問題があります(X(最初の)エントリの合計ではなく、列のすべての値を合計として受け取ります)。

limit総関数を計算した後に取得されたようですsum

最初のXエントリによってのみ制限される合計を取得するにはどうすればよいですか?

4

2 に答える 2

10

LIMITMurifoXの提案は、1行(合計)しかない最終結果セットにのみ適用されるため、機能しません。このスレッドを参照してください。

これを解決する最も簡単な方法は、データベースでカウントを行わないことです。

Model.where(:id => id).order('date DESC').limit(3).pluck(:column).compact.sum

これにより、の値がRubyにロードcolumnされ、そこで合計されます。さて、レコードのセットが本当に膨大な場合、これらの値がすべてアプリのメモリに読み込まれているという理由だけで、これは明らかに効率が低下します。

編集:追加.compact-これにより、配列を合計する前に配列からnilsが削除されます(これによりエラーが発生します)。

SQLでこれを行うための推奨される方法は、次のようなサブクエリを使用することです。

SELECT SUM(subquery.column) FROM (
  SELECT * FROM models WHERE id = 5 LIMIT 3
) AS subquery;

特定のモデルのテーブルから選択することを期待しているため、これをActiveRecordクエリに変換する簡単または簡単な方法はありません。

于 2013-03-18T15:06:02.917 に答える
1

逆にクエリを書き込もうとしましたか?

My_model.where(:id => id).order('date DESC').limit(X).sum(:column)

このようにして、絞り込んだ値のみを合計するようにモデルをフィルタリングしました。

于 2013-03-18T11:47:38.927 に答える