2012-02-15 17 views
0

私はruby mysql2 gemを使ってデータベースを操作しています。地域ごとのすべての国を1つのテーブルにリストし、地域ごとのヒット数を追加したいと思います。複数の配列に数値をルビと一緒に追加する

通常、私は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

答えて

0

の場合:

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表にない地域の合計をしたい場合にこれをデータベースエンジンに委譲するには、 (簡単にするため、配列はすでに配列であると仮定します)

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

あなたの例が助けになりました。ありがとう。 – jhgfds

2

データベースが仕事やってみましょう:あなたはしたくない何らかの理由

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

+0

@willejs:これはMySQLのCLIが何を意味するのかわかりません。 –

+0

もし私がmysql2 gemを使用してそのクエリを実行すると、結果は得られますが、ヘッダとフォーマットを配列に入れ、結果をスクランブルして読めなくなります。 – jhgfds

関連する問題