【问题标题】:How to get total result set size on a group_by count query?如何获取 group_by 计数查询的总结果集大小?
【发布时间】:2015-12-01 22:43:39
【问题描述】:

我的模型中有以下查询:

Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc').page(1).per(25).count

我正在使用kaminari gem 进行分页,但问题是:此查询返回似乎是排序散列的内容。但是我无法知道总结果数是多少。

如果您不想考虑kaminari,可以参考以下查询:

Post.where("created_utc > ? AND lower(category) = ?", min_time, subreddit.downcase).group(:domain).order('count_all desc').limit(limit).offset(start).count

无论如何,我无法弄清楚结果的总数是多少。我该如何解决这个问题?有什么方法可以计算出没有限制的总结果集大小?

【问题讨论】:

  • 你试过size而不是count吗?
  • @BroiSatse 不,但即使我这样做了,那如何解决这个问题?

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord kaminari


【解决方案1】:

除了基于 ruby​​ 的方法之外,我还会对运行单独的基于数据库的计数进行基准测试。

posts        = Post.where("created_utc > ? AND lower(category) = ?", min_time, subreddit.downcase)
domain_count = posts.count("distinct domain")
result       = posts.group(:domain).order('count_all desc').limit(limit).offset(start).count

【讨论】:

    【解决方案2】:

    你想要的是.length而不是.count,像这样:

    Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc').page(1).per(25).length
    
    • .count 执行 SQL COUNT
    • .length 计算结果数组的长度

    感谢@BenHawker https://stackoverflow.com/a/34541020/380607

    【讨论】:

      【解决方案3】:

      Kaminari 提供了一个total_count 方法。 https://github.com/kaminari/kaminari/blob/master/README.md#the-per-scope

      【讨论】:

        【解决方案4】:

        我会把它分成多行:

        # 1. get the results
        posts = Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc')
        # 2. count the total size
        total_size = posts.count
        # 3. use kaminari for pagination
        posts_paged = posts.page(1).per(25)
        

        【讨论】:

        • 但这不会导致运行多个查询吗?我希望在一个查询中完成此操作。
        • 你需要两个独立的东西:总计数和分页结果数组,对吧?我认为您至少需要两个查询才能实现它。
        • 有一种方法可以避免两次查询,但成本可能更高。一个更好的想法可能是缓存查询(使用 memcache 之类的东西),这样它就不需要每次都很昂贵。
        • 另外,这样你也限制了第一个请求的结果集。
        猜你喜欢
        • 1970-01-01
        • 2011-05-30
        • 1970-01-01
        • 2020-09-21
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多