我环顾四周,找不到任何答案。所有答案都涉及未使用 GROUP BY 的计数。
背景: 我有一个分页器,它将为 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
正如你所看到的,它只是在'tags.*, 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 结果集而不是行数。
有没有办法解决这个问题,或者我是否必须破解分页器来解释使用 GROUP BYs 的查询(我将如何去做)?