Я оглянулся и не смог найти ответов на это. Все ответы включают подсчеты, которые не использовали GROUP BY.
Справочная информация:
У меня есть paginator, который будет принимать параметры для ActiveRecord.find. Он добавляет опцию: limit и: offset и выполняет запрос. Мне также нужно подсчитать общее количество записей (за вычетом лимита), но иногда запрос содержит параметр: group, и ActiveRecord.count пытается вернуть все строки, возвращенные GROUP BY, вместе с каждым из них. Я делаю это в Rails 2.3.5.
Я хочу, чтобы ActiveRecord.count возвращал количество строк, возвращаемых GROUP BY.
Вот пример кода, который демонстрирует один его экземпляр (используется для поиска всех тегов и упорядочения их по количеству сообщений с этим тегом):
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 () вокруг тегов. *, 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(*)
, который возвращает весь набор результатов GROUP BY, а не количество строк.
Есть ли способ обойти это, или мне придется взломать paginator для учета запросов с GROUP BYs (и как мне это сделать)?