1

私がテーブルに問い合わせたと言う

rawStats = Stats::TrackProcessed.select("token")

テーブル内のすべてのトークンの数を受け取りました。

このように見えます:

3e79a387c29bda1069271e06ad03d82b8296242e
059681f46ab1c1fa8cf8443a82f0898172e0b646
eacd846ea4e91b49f92f416f61e0f2d075b9dae7
eacd846ea4e91b49f92f416f61e0f2d075b9dae7
811705019a970929801adbf3db0ede31ed01816c

このようなハッシュリストを返す必要があります

{
   '3e79a387c29bda1069271e06ad03d82b8296242e' => 1,
   '059681f46ab1c1fa8cf8443a82f0898172e0b646' => 1
   'eacd846ea4e91b49f92f416f61e0f2d075b9dae7' => 2
   '811705019a970929801adbf3db0ede31ed01816c' => 1
}

最初の値がトークンで、2番目の値がテーブル内のこのトークンの出現回数です。次に、すべてのレコードからこれの平均値を取得する必要があります。

これまでのところ、私はテーブルをクエリすることで得ました

rawStats = Stats::TrackProcessed.select("distinct token")

一意のトークンを取得する

そして、各ループは各トークンの発生数をカウントしますが

rawArr = []
rawStats.each do |r|
  token = {
    :token => r.token,
    :count => rawStats.where("token = ?",r.token).count('token')
  }

  rawArr << token
end

しかし、これは次のように処理されます

(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '196e595b573f71fc2af04693c73809303bebd62d'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = 'db67ab44e94ca338d90e902a36c37b4998a47ff0'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = 'a8a78cffc0935b07f90b5f3008dcad27e8ac71c7'
(0.8ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '91b8ae5ffa12ece30d8548b488fab8aff7614f2b'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '649e7aa59cc8af6c59cec1cf637ffed1ce6b3be7'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '441dae6f22776687b57daaaeef2c63c31902b987'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '6b8937a13012f22c8a4cdd4ed4caad0ad8761d3b'
(0.6ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = 'beaba154f38d5c9b64e4fb2d851ec785bd6bc4ec'
(0.6ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = 'efa9f3a71c4ff33abcae4af788ef6d0be599f76a'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '053a7727885f3c4099a9b31a2eccc77b99df50ee'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = '32dc984c9f85ff91242533144cd179a9b4529bed'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = 'a58804ae38490f08a1645c8271e88df3757fe771f'
(0.7ms)  SELECT COUNT(`stats_track_processed`.`token`) FROM `stats_track_processed` WHERE `stats_track_processed`.`token` = 'a58804a2e38490f08a1645c8271e88df3757fe771f'

大量のデータを処理するときに各トークンを個別にクエリすることは、非常に悪い考えのように見えます。

私はすでにSQLクエリを介してこれを行っていました、このように見えます

SELECT AVG(viewsAverage) as total 
FROM 
 (SELECT COUNT(token) AS viewsAverage 
  FROM stats_track_processed 
  WHERE admedia_id = #{params[:admedia_id]} 
    AND #{params[:banner_id]} 
    AND (access_time BETWEEN '#{params[:begin]}' 
    AND DATE_ADD('#{params[:end]}', INTERVAL 1 DAY)) 
  GROUP BY token) 
stats_track_processed

しかし、これは本当にくだらない解決策のように見えます。私は現在、コードをリファクタリングして、すべてのロジックをコントローラーに移動しています。

どんな助けでも大歓迎です。

前もって感謝します。

4

3 に答える 3

2

これを試して

 Stats::TrackProcessed.select(:token).count(group: :token)

乾杯。

于 2012-08-09T07:44:52.520 に答える
1

完全なリストを繰り返し処理し、カウントのハッシュを維持します。

result = Stats::TrackProcessed.select("token")
counts = Hash.new{|h,k| h[k] = 0 }
result.each{|el| counts[el] +=1}

次に、平均を取得するには、次のようなことを行うことができます

 average = counts.values.inject(0){|sum, el| sum + el} / counts.length
于 2012-08-09T07:28:54.087 に答える
1

次のように、単一のクエリでこれを実現できます。

SELECT SUM(IF(token = '196e595b573f71fc2af04693c73809303bebd62d', 1, 0)) AS token_1,
       SUM(IF(token = 'db67ab44e94ca338d90e902a36c37b4998a47ff0', 1, 0)) AS token_2,
       ...
FROM `stats_track_processed`
WHERE `stats_track_processed`.`token` IN('196e595b573f71fc2af04693c73809303bebd62d',
                                         'db67ab44e94ca338d90e902a36c37b4998a47ff0', ...);

また

SELECT token, 
       COUNT(token) AS token_count
FROM stats_track_processed
GROUP BY token;
于 2012-08-09T07:20:08.943 に答える