Mysql 获取分页查询中的结果总数

Mysql 获取分页查询中的结果总数,mysql,ruby-on-rails,ruby,Mysql,Ruby On Rails,Ruby,在我的RoR应用程序中,我有一个查询,可以返回0到1000000个结果,我限制为16个,并为以下内容提供分页: find(:all, :conditions => conditions, :limit => limit, :offset => offset) 我希望能够告诉用户他们正在查看的结果数量与结果总数。有点像“500人中的16人”。在不进行非限制查询的情况下获取总行数的最佳方法是什么?如果结果集很大,查询速度肯定会很慢?我还想保持对数据库的不可知性。数据库无法知道与查

在我的RoR应用程序中,我有一个查询,可以返回0到1000000个结果,我限制为16个,并为以下内容提供分页:

find(:all, :conditions => conditions, :limit => limit, :offset => offset)

我希望能够告诉用户他们正在查看的结果数量与结果总数。有点像“500人中的16人”。在不进行非限制查询的情况下获取总行数的最佳方法是什么?如果结果集很大,查询速度肯定会很慢?我还想保持对数据库的不可知性。

数据库无法知道与查询匹配的行数,除非它实际执行整个查询。例如,如果选择MYCOLUMN>5,则需要读取表中每一行的MYCOLUMN,以了解有多少行的值大于5。(尽管您可以通过索引提高效率。)

通常使用COUNT(*)达到您描述的目的


我能想到的获取查询返回的行数的唯一其他方法是在表上放置一个触发器函数,该函数根据行是否与查询匹配,在每次插入、更新或删除行时更新计数。然而,这是严格的,因为它必须针对单个查询进行定制,而且它肯定不是一种与数据库无关的方法。

看来我应该更彻底地利用谷歌。Rails有一个名为(go figure)的内置类来进行实用的数据库计数。我最终使用了如下代码:

results = find(:all, :conditions => conditions, :limit => limit, :offset => offset)
total_count = count(:conditions => conditions)
return {:results => results, :total_count => total_count}

是的,Bloudermilk,您可以使用
count
而不使用
:limit
选项来获取它返回的所有行数。数据库过载不是一个问题:它们通常可以非常快地处理
COUNT
查询。只要确保在条件列上有索引,一切都会正常运行。我真的不推荐像存储过程或触发器函数这样的解决方案。直接使用程序数据库可能会非常痛苦,并且会导致很多麻烦,所以您必须有真正的理由这样做。