2012-02-15 27 views
0

我正在使用ruby mysql2 gem來處理數據庫。我想在一張表中列出每個地區的所有國家,然後將每個地區的點擊量加起來。在幾個數組中添加數字以及ruby

通常我會使用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 

我如何能實現每個區域運行中計?

+0

我必須將每個數組的每個結果轉換爲fixnum,將其添加到新數組中,然後將數組中的所有值添加到數組中以獲得結果。 – jhgfds 2012-02-15 15:24:42

回答

0

如果由於某種原因,你不希望把它委託給數據庫引擎,你可以這樣做: (爲了簡單起見,我假設你的結果已經是數組)

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

你的例子有所幫助。謝謝。 – jhgfds 2012-02-15 13:43:31

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 
+0

「通常我會使用mysql SUM函數,但是gem返回標題,所以這是不可能的。」 mysql函數返回標題,因爲我使用的是cli以及總數。所以結果是無效的。 – jhgfds 2012-02-15 12:45:40

+0

@willejs:我不明白這是什麼意思或MySQL CLI如何做到這一點。 – 2012-02-15 17:22:17

+0

如果我使用mysql2 gem並執行該查詢,我會收到結果,但是會將標題和格式填充到數組中,導致結果無法讀取。 – jhgfds 2012-02-17 01:53:09

相關問題