将几个数组中的数字与ruby一起添加

时间:2012-02-15 07:03:33

标签: mysql sql ruby rubygems mysql2

我使用ruby mysql2 gem来处理数据库。我想在一个表中列出每个地区的所有国家/地区,然后将每个地区的点击数加起来。

通常我会使用mysql SUM函数,但是gem会返回标题,所以这是不可能的。

相反,我得到每个地区的每个国家/地区的点击次数并将其加起来。 gem每个结果返回1个数组,我需要获得该结果并将其添加到每个区域的运行总计。

这是我的代码:

#!/usr/bin/ruby -w
# simple.rb - simple MySQL script using Ruby MySQL module

require "rubygems"
require "mysql2"

client = Mysql2::Client.new(:host => "localhost", :username => "root", :database => "cbscdn")
regions = client.query("select Id from Regions")

regions.each(:as => :array) do |rid|
  hit = client.query("select hits from Countries where Regions_Id='#{rid}'")
  hit.each(:as => :array) do |a|
    a.map do |x|
      x.to_i
    end
  end
end

如何实现每个区域的运行计数?

2 个答案:

答案 0 :(得分:2)

让数据库完成工作:

client.query(%q{
    select regions_id, sum(hits)
    from countries
    group by regions_id
}).each(:as => :array) do |row|
    region_id, total_hits = row
    #...
end

如果你想要countries表中没有区域的总和:

client.query(%q{
    select r.id, coalesce(sum(c.hits), 0)
    from regions r
    left outer join countries c
    on r.id = c.regions_id
    group by r.id
}).each(:as => :array) do |row|
    region_id, total_hits = row
    #...
end

答案 1 :(得分:0)

如果由于任何原因您不想将其委托给数据库引擎,您可以这样做: (为简单起见,我假设您的结果已经是数组)

regions_count = regions.inject({}) do |hash, rid|
  hit = client.query("whatever")
  hash[rid] = hit.map(&:to_i).inject(0, :+)
  hash
end