2015-04-05 69 views
0

所以,我有模型用户,提交和下载。用户可以有多个提交,并且提交有许多下载。下载跟踪IP地址等,并构成时间序列数据。问题是,我需要能够执行查询,例如查找过去一周内下载量最大的用户。我真的不知道从哪里开始,并会有所帮助,将不胜感激。复杂MySql加入 - 导轨

表的主要部分包括其具有id其具有具有submission_idid一个user_idid,并下载用户,提交。

所以基本上,我需要选择所有下载的由一个特定的用户所拥有的意见书,指望他们了,然后对它们进行排序,以找到具有最大的下载用户。这是真的可能,还是有效的?我应该只是添加一个说owner_id到下载模型,然后基于该查询?

感谢您的任何帮助。

回答

1

对不起我没有50的声誉,所以我不能添加评论你的原始SQL的答案,但你可以试试这个写在轨查询此:

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

所以让所有的用户,通过USER_ID加入提交表并获得其下载相关表格,以及,然后通过USER_ID组...等

给一个尝试?

+0

嘿,这个工程!大部分)最终查询是:User.all.joins(:submissions =>:downloads).group(“users.id”)。order(“count(users.id)DESC”)'''Any想法如何我可以去获得与用户的下载计数?在我的原始查询,它返回说'''568; 199,556; 195''(user_id,count)。谢谢你的方式! – Jake 2015-04-06 03:12:02

+0

我似乎通过在查询的末尾添加'''.count''来计算出来,并将用户标识映射到下载的数量。这应该可行,谢谢! – Jake 2015-04-06 03:17:05

1

我是相当新的Rails,但是我认为你应该在你的用户模型中使用

has_many :downloads, :through => :submission 

。那么我认为你可以这样做User.downloads.count

+0

这可以工作,除了我需要能够为所有用户排序并找到具有最高下载次数的用户。我不认为这样排序会非常有效。我想我已经找到了一个解决方案,虽然与原始的SQL,并可能发布一点。 – Jake 2015-04-06 00:05:06

+0

订购不是一个问题 - 你可以通过'count_rails-magic'命令(抱歉,我不记得那些导轨会放在那里)。原始的SQL应该不是一个问题,但我猜测它会更有效率。 – jcuenod 2015-04-06 00:08:51

1

尝试:

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

你看着办吧。

还有其他的连接你可能会想尝试,但是这是一个简单的出发点。

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中的连接,但我很可能会想出如何尽快实现这一点。感谢任何人评论!

+1

但是后来你会写SQL :-P – 2015-04-06 00:49:53

+0

是的,我知道:(我将尝试弄清楚如何使用活动记录将其工作到轨道查询中,其他方面的工作原理也是如此) – Jake 2015-04-06 00:53:24

1

为什么不试一下这个Download.all.group(:USER_ID).order( “计数(ID)DESC”)

所以,你得到所有的下载,它们分组由USER_ID和计数所有下载对于该用户和由DESC订购。

我想这就是你想要的?

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

+0

这是如果我找不到另一个使用连接的解决方案,我打算做什么,我真的不想再添加另一个列,但我认为我找到了一个现在可以使用的解决方案。 – Jake 2015-04-06 00:52:40