4

統計目的で使用されるクエリがあります。特定の回数ログインしたユーザーの数を分類します。ユーザーhas_manyのインストールとインストールにはlogin_countがあります。

select total_login as 'logins', count(*) as `users` 
  from (select u.user_id, sum(login_count) as total_login 
          from user u 
               inner join installation i on u.user_id = i.user_id
               group by u.user_id) g
  group by total_login;

+--------+-------+
| logins | users |
+--------+-------+
| 2      |     3 |
| 6      |     7 |
| 10     |     2 |
| 19     |     1 |
+--------+-------+

findこれと同じ情報を取得するためのエレガントなActiveRecordスタイルはありますか?理想的には、ログインとユーザーのハッシュコレクションとして:{ 2=>3, 6=>7, ...

SQLを直接使用できることは知っていますが、Rails3でこれをどのように解決できるか知りたいと思いました。

4

3 に答える 3

6
# Our relation variables(RelVars)
U =Table(:user, :as => 'U')
I =Table(:installation, :as => 'I')

# perform operations on relations
G =U.join(I)  #(implicit) will reference final joined relationship

#(explicit) predicate = Arel::Predicates::Equality.new U[:user_id], I[:user_id]
G =U.join(I).on( U[:user_id].eq(I[:user_id] ) 

# Keep in mind you MUST PROJECT for this to make sense
G.project(U[:user_id], I[:login_count].sum.as('total_login'))

# Now you can group
G=G.group(U[:user_id])

#from this group you can project and group again (or group and project)
# for the final relation
TL=G.project(G[:total_login].as('logins') G[:id].count.as('users')).group(G[:total_login])

「ここにコードがあります」だけでなく、操作の順序を示したかったので、これは非常に冗長であることに注意してください。コードは実際には半分のコードで書くことができます。

毛深い部分はCount()です。原則として、集計で使用されていないSELECTの属性は、GROUP BYに表示される必要があるため、count()に注意してください。

total_loginカウントでグループ化するのはなぜですか?一日の終わりに、ユーザー情報は最も外側のカウントグループによって無関係になるので、すべてのインストールの合計ログイン数をカウントしてみませんか。

于 2010-05-26T12:15:59.473 に答える
2

dbに作業を行わせるほど効率的なものはないと思います。データベースから行を取得する必要はなく、データベース自体がデータをグループ化して回答を計算する必要があることに注意してください。

SQLをデータベースにさらにプッシュする場合は、データベース内のビューとしてクエリを作成し、RailsActiveRecordクラスを使用して結果を取得できます。

于 2010-05-26T00:39:13.233 に答える
0

結局のところ、SQL構文ははるかに読みやすくなっています。このアレールのものは、私がほんの少しだけ複雑さを必要とするとき、いつも私を遅くしています。それはあなたが学んだもう一つの構文であり、それだけの価値はありません。このような場合はSQLに固執します。

于 2010-07-15T08:10:55.450 に答える