Я огляделся и не мог найти ответы на это. Все ответы включали подсчеты, в которых не использовали 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 BY (и как я буду это делать)?