【问题标题】:Select sum of a field选择字段的总和
【发布时间】:2012-07-27 23:29:57
【问题描述】:

那个标题不是很具描述性;我不知道如何缩短我的问题...

假设我有一个weightlifters 的表,其中namepoundstype_of_lift 作为字段。该表中有数百个条目。我想检索表中总磅数最高的 10 人。我写了以下内容:

Weightlifter.order("pounds DESC").limit(10)

这很好,除了我想要累积权重。因此,如果一个人不止一次进入前 10 名,我不希望他的名字被列出两次,我想将权重加在一起并将它们显示为总和。所以如果我有:

"Johnny", "300", "Bench"
"Wesley", "295", "Bench"
"Johnny", "280", "Clean"
...
"Timmy", "150", "Curl"

我想显示 580 磅的约翰尼,而不是 300 磅的约翰尼,然后再显示 280 磅的约翰尼。

这是怎么做到的?

Ruby 1.9.3、Rails 3.2.6、SQLite3 3.6.20

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby sqlite activerecord


    【解决方案1】:

    应该是这样的

    Weightlifter.select('name, type_of_lift, sum(pounds) as pounds').
                 group('name').
                 order("sum(pounds) DESC").
                 limit(10)
    

    这里有一个很好的指南:ActiveRecord Query Interface

    【讨论】:

    • 好的,假设我需要返回整个条目,而不仅仅是名称。然后呢?
    • @XMLSlayer:“Johnny”(您的示例)有多个条目,您希望返回哪一个?
    • 在我的实际情况下没关系;所有其他字段都是相同的。这只是一个例子。我想第一个就足够了;我可以从那里概括。
    • @XMLSlayer: 然后将所有其他字段添加到 select 子句。查看更新的答案
    • 它会扫描表格中的所有记录,计算磅数并计算正确的前10名。
    【解决方案2】:
    # in your WeightLifter model
    class Weightlifter < ActiveRecord
    
      attr_accessor :weight_total
    
    
    # WeightLifterController
    
    lifters = []
    
    Weightlifter.order("pounds DESC").each do |lifter| 
    
      return lifters if lifters.count == 10
    
      if !lifters.collect{|a| a[:name] }.include?(lifter.name)
        lifters << lifter
        local_lifter = lifters.where(name: lifter.name).first
        local_lifter.weight_total = lifter.weight
      else
        local_lifter = lifters.where(name: lifter.name).first
        local_lifter.weight_total = local_lifter.weight_total + lifter.weight
      end
    
    end
    

    【讨论】:

    • 我已经想到了。这对将权重相加没有任何作用。它只是忽略任何重复的名称。我需要总计。
    • 您的编辑在控制台中为我引发了错误。 undefined method 'limit'
    • 也感谢您的帮助。这段代码也可以工作(只要确保修改数组本身,而不仅仅是从中提取的元素。更改local_lifter.weight_total 不会将更改提交给数组),但我正在寻找类似的东西塞尔吉奥的密码。不过谢谢!
    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 2012-07-26
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多