【问题标题】:Getting the total amount of results in a paginated query获取分页查询中的结果总数
【发布时间】:2009-12-01 23:27:46
【问题描述】:

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

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

我希望能够告诉用户他们正在查看的结果数量与结果总数的对比。类似于“显示 16 of 500”。在不进行无限制查询的情况下获得总行数的最佳方法是什么,在大型结果集的情况下这肯定会很慢?我还想保持与数据库无关。

【问题讨论】:

    标签: mysql ruby-on-rails ruby


    【解决方案1】:

    看来我应该更彻底地使用谷歌。 Rails 有一个名为ActiveRecord::Calculations 的内置类(见图)来进行实用的数据库计数。我最终使用了这样的代码:

    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 查询。只要确保在条件列上有索引,一切都会运行良好。我真的不推荐诸如存储过程或触发器函数之类的解决方案。直接程序数据库可能会非常痛苦并会导致很多头痛,以至于您必须有真正的理由这样做。
    【解决方案2】:

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

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

    我能想到的在不做太多工作的情况下获得查询返回的行数的唯一另一种方法是在表上放置一个触发器函数,该函数在每次插入、更新或更新行时更新计数根据是否与查询匹配删除。但是,这是僵化的,因为它必须针对单个查询进行定制,而且它肯定不是一种与数据库无关的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2013-10-23
      • 1970-01-01
      • 2015-04-12
      • 2015-10-23
      • 1970-01-01
      • 2021-01-29
      • 2013-01-02
      相关资源
      最近更新 更多