查询对象包括聚合计数数据

时间:2016-04-12 18:25:21

标签: mysql ruby-on-rails ruby

我试图为管理员构建一个基本的表格来查看用户,他们邀请了多少用户以及这些用户中有多少人为他们的订阅付费。细长的桌子看起来像这样:

User: id, email
Referral: id, inviter_id <- (maps to user_id), paid_at (date, is either nil or set)

我遇到的问题是我需要聚合数据,然后进行排序,然后在将集合返回到视图之前进行分页。如果可能的话,我希望拥有完整的用户对象,尽管如果不可能,我只会满足于我需要的字段。

我一直试图重做以下内容:

User.joins(:referrals).group('users.id').count('referrals.id')

这会返回{ id: count }的哈希值。我怎样才能在paid_at IS NOT NULL时获得结果,甚至将它们作为关键值对?我一直在尝试加入,但如果做得不对,我感到很茫然,非常感谢任何帮助。

编辑:

我也试过了这个问题:

User.joins(:referrals).select('users.id, users.email, count(referrals.id)').group('users.id, users.email')

但是它只返回id和电子邮件,我假设因为ActiveRecord模型没有referrals_count的字段。

编辑:添加了SQL

  SELECT
    users.id,
    users.email,
    COUNT(DISTINCT(r1.id)) AS referrals_count, 
    COUNT(DISTINCT(r2.id)) AS paid_referrals_count
  FROM
    users
  LEFT JOIN
    referrals AS r1 ON users.id = r1.inviter_id AND
    r1.accept_at IS NOT NULL
  LEFT JOIN
    referrals AS r2 ON r1.id = r2.id AND
    r2.paid_at IS NOT NULL
  GROUP BY
    users.id, users.email
  ORDER BY
    paid_referrals_count

我不确定上面的sql是否有效,这是我试图获取的数据的第一次传递。

1 个答案:

答案 0 :(得分:1)

“我假设因为ActiveRecord模型没有referrals_count的字段。”你是对的。在您的选择中使用AS paid_referrals_count

User.joins(:referrals).select('users.id, users.email, count(referrals.id) AS paid_referrals_count').group('users.id, users.email')