在我的RoR应用程序中,我有一个可以返回0到1000000结果的查询,我限制为16并为以下内容提供分页:
find(:all, :conditions => conditions, :limit => limit, :offset => offset)
我希望能够告诉用户他们查看了多少结果与结果总量。像“显示16的500”这样的东西。在不进行非限制查询的情况下获取总行数的最佳方法是什么?在大结果集的情况下,这肯定会很慢?我还想保持与数据库无关。
答案 0 :(得分:2)
看起来我应该更彻底地利用谷歌了。 Rails有一个名为ActiveRecord::Calculations的内置类(go figure)来进行实用的数据库计数。我用这样的代码结束了:
results = find(:all, :conditions => conditions, :limit => limit, :offset => offset)
total_count = count(:conditions => conditions)
return {:results => results, :total_count => total_count}
答案 1 :(得分:0)
数据库无法知道与查询匹配的行数,除非它实际执行整个事务。例如,如果您选择的是MYCOLUMN> 5,则需要在表格的每一行中读取MYCOLUMN,以了解有多少值的值大于5.(尽管您可以通过索引提高效率。)
通常会将COUNT(*)用于您所描述的目的。
我能想到的唯一另一种方法是获取为查询返回的行数,而不需要做太多工作,就是在每次插入,更新或更新行时更新计数的表上放置一个触发器函数。根据它是否与查询匹配而删除。但是,这是严格的,因为它必须针对单个查询进行自定义,并且它当然不是与数据库无关的方法。