加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用Rails查询语言的复杂查询

发布时间:2020-12-17 02:51:06 所属栏目:百科 来源:网络整理
导读:我有一个用于统计目的的查询.它会分解已登录指定次数的用户数.用户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
我有一个用于统计目的的查询.它会分解已登录指定次数的用户数.用户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 |
+--------+-------+

是否有一些优雅的ActiveRecord样式可以获取相同的信息?理想情况下,作为登录和用户的哈希集合:{2 => 3,6 => 7,…

我知道我可以直接使用sql,但想知道如何在rails 3中解决这个问题.

解决方法

# 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计数分组?在一天结束时,我只想问为什么不对所有安装的总登录数进行计数,因为最外面的计数分组使得用户信息无关紧要.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读