复杂的MySql加入 - rails

时间:2015-04-05 23:38:30

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

所以,我有模型User,Submission和Download。用户可以有很多提交,并且提交有很多下载。下载跟踪IP地址等,并且构造为时间序列数据。问题是,我需要能够查找过去一周内下载次数最多的用户。我真的不知道从哪里开始,任何帮助都会受到赞赏。

表格的主要部分包括具有id的用户,具有user_idid的提交,以及具有submission_id和{{1}的下载}}

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

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

我对Rails相当新,但我认为你应该使用

has_many :downloads, :through => :submission

在您的用户模型上。然后我认为你可以做User.downloads.count

之类的事情

答案 1 :(得分:1)

尝试:

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

你会弄清楚。

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

答案 2 :(得分:1)

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

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

我认为这就是你想要的?

*顺便说一句,不要忘记添加user_id列。

答案 3 :(得分:1)

抱歉,我没有50个声誉,所以我无法对你的原始sql答案添加评论,但你可以尝试这个写入rails查询:

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

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

试一试?

答案 4 :(得分:0)

所以,我最终用原始的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中的连接,但我可能会想出如何很快实现它。感谢任何评论过的人!