私は周りを見回しましたが、これに対する答えは見つかりませんでした。すべての回答には、GROUPBYを使用しなかったカウントが含まれていました。
背景: ActiveRecord.findのオプションを取得するページネーターがあります。:limitおよび:offsetオプションを追加し、クエリを実行します。また、レコードの総数(制限を除く)をカウントする必要がありますが、クエリに:groupオプションが含まれている場合があり、ActiveRecord.countは、GROUPBYによって返されたすべての行とそのカウントを返そうとします。Rails2.3.5でこれを行っています。
私が欲しいのは、ActiveRecord.countがGROUPBYによって返された行数を返すことです。
これの1つのインスタンスを示すサンプルコードを次に示します(すべてのタグを検索し、そのタグを持つ投稿の数で並べ替えるために使用されます)。
options = { :select => 'tags.*, COUNT(*) AS post_count',
:joins => 'INNER JOIN posts_tags', #Join table for 'posts' and 'tags'
:group => 'tags.id',
:order => 'post_count DESC' }
@count = Tag.count(options)
options = options.merge { :offset => (page - 1) * per_page, :limit => per_page }
@items = Tag.find(options)
:selectオプションを使用すると、Tag.countは次のSQLを生成します。
SELECT count(tags.*, COUNT(*) AS post_count) AS count_tags_all_count_all_as_post_count, tags.id AS tags_id FROM `tags` INNER JOIN posts_tags GROUP BY tags.id ORDER BY COUNT(*) DESC
ご覧のとおり、これは単にCOUNT()を'tags。*、COUNT(*)'にラップしているだけであり、MySQLはCOUNT内のCOUNTについて文句を言います。
:selectオプションを指定しない場合、次のSQLが生成されます。
SELECT count(*) AS count_all, tags.id AS tags_id FROM `tags` INNER JOIN posts_tags GROUP BY tags.id ORDER BY COUNT(*)
これは、行数ではなく、GROUPBY結果セット全体を返します。
これを回避する方法はありますか、それともGROUP BYを使用したクエリを説明するためにページネーターをハックする必要がありますか(そしてそれをどのように行うのでしょうか)?