【问题标题】:Complex MySql joins - rails复杂的 MySql 连接 - rails
【发布时间】:2015-04-05 23:38:30
【问题描述】:

所以,我有模型用户、提交和下载。一个用户可以有很多提交,一个提交有很多下载。下载跟踪 IP 地址等,并被构造为时间序列数据。问题是,我需要能够进行查询,例如查找过去一周下载量最多的用户。我真的不知道从哪里开始,如果有任何帮助,我们将不胜感激。

表格的主要部分包括具有id 的用户、具有user_idid 的提交以及具有submission_idid 的下载。

所以基本上,我需要选择特定用户拥有的提交的所有下载,计数,然后对它们进行排序以找到下载次数最多的用户。这真的可能吗,或者有效吗?我是否应该在 Download 模型中添加一个say owner_id,然后根据它进行查询?

感谢您的帮助。

【问题讨论】:

    标签: mysql ruby-on-rails postgresql join activerecord


    【解决方案1】:

    对不起,我没有 50 名声望,所以我无法对你的原始 sql 答案添加评论,但你可以尝试在 rails 查询中写这个:

    User.all.joins(:submission => :downloads).group(:user_id).order("count(user_id) DESC")
    

    所以获取所有用户,通过 user_id 加入提交表并获取其下载关联表,然后按 user_id...等分组

    试试看?

    【讨论】:

    • 嘿,这行得通! (大部分情况下)最终查询是:User.all.joins(:submissions => :downloads).group("users.id").order("count(users.id) DESC") 知道如何获取用户的下载次数吗?在我的原始查询中,它返回说568;199, 556;195 (user_id, count)。顺便谢谢!
    • 我似乎已经通过在查询末尾添加.count 来解决这个问题,并将用户 ID 映射到下载次数。这应该可以,谢谢!
    【解决方案2】:

    我对 Rails 还很陌生,但我认为你应该使用

    has_many :downloads, :through => :submission
    

    在您的用户模型上。那我觉得你可以做类似User.downloads.count

    【讨论】:

    • 这可以工作,除了我需要能够为所有用户排序并找到下载次数最多的用户。我不认为这样的排序会非常有效。我想我已经找到了一个使用原始 sql 的解决方案,并且可能会稍后发布。
    • 订购不是问题——您可以通过count_rails-magic 订购(抱歉,我不记得rails 会放什么)。原始 sql 应该不是问题,我猜它会更有效率。
    【解决方案3】:

    你为什么不试试这个 Download.all.group(:user_id).order("count(id) DESC" )

    因此,您获得所有下载,按 user_id 对它们进行分组,并计算该用户的所有下载并按 DESC 排序。

    我想这就是你想要的?

    *顺便别忘了添加 user_id 列。

    【讨论】:

    • 如果我找不到使用连接的另一个解决方案,这就是我计划做的事情。我真的不想再添加一列,但我想我已经找到了一个现在可以使用的解决方案。
    【解决方案4】:

    试试:

    Submission.joins(:user,:downloads).
    group('submissions.id','downloads.submission_id').
    order('count_all DESC').
    limit(10).
    count
    

    你会明白的。

    您可能想尝试其他联接,但这是一个简单的起点。

    【讨论】:

      【解决方案5】:

      所以,我最终用原始 sql 查询解决了这个问题,这就是我想出的:

      SELECT 
          users.id, 
          COUNT(*) AS subdownload_count
      FROM users
          INNER JOIN submissions ON users.id = submissions.creator_id
          INNER JOIN downloads ON submissions.id = downloads.submission_id
      GROUP BY 
          users.id
      ORDER BY
          subdownload_count DESC
      

      过去一年我一直在使用 nosql,所以我并不完全了解 rails 中的连接,但我可能很快就会弄清楚如何实现它。感谢所有评论的人!

      【讨论】:

      • 但是你会写 SQL :-P
      • 是的,我知道 :( 我将尝试弄清楚如何使用活动记录将其用于 Rails 查询,否则它的工作原理相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      相关资源
      最近更新 更多