2015-04-05 113 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