2010-10-18 65 views
1

我有一個名爲Statement的模型,屬於Member。給定一個成員數組,我想創建一個查詢,它將爲每個成員返回最新的語句(最好在一個很好的乾淨查詢中)。ActiveRecord/MySQL查詢返回分組對象集

我想我也許能達到這個使用grouporder - 是這樣的:

# @members is already in an array 

@statements = Statement.all(
    :conditions => ["member_id IN(?)", @members.collect{|m| m.id}], 
    :group  => :member_id, 
    :order  => "created_at DESC" 
) 

但不幸的是上面總是返回爲每個成員最古老聲明。我已經嘗試交換訂單選項,但是它總是返回組中最早的陳述,而不是最近的陳述。

我猜group_by是不是實現這一目標的方式 - 那麼我該如何實現呢?

PS - 如果您知道如何在原始MySQL中實現此目標,則任何非Ruby/Rails人員都會閱讀此內容,然後開除。

回答

2

在MySQL中,您需要一個子查詢,該查詢返回每個成員的最大值created_at,然後可以將該值返回到Statement表以檢索該行的其餘部分。

SELECT * 
FROM Statement s 
    JOIN (SELECT 
       member_id, MAX(created_at) max_created_at 
      FROM Statement 
      GROUP BY member_id 
    ) latest 
     ON s.member_id = latest.member_id 
     AND s.created_at = latest.max_created_at 
+0

謝謝你,奇妙地工作。對於任何感興趣的人,這是我如何將它集成到Rails:'Statement.find_by_sql [「SELECT * FROM statements s JOIN(SELECT member_id,MAX(date_from)max_date FROM statements GROUP BY member_id)latest ON s.member_id = latest.member_id AND s.date_from = latest.max_date WHERE s.member_id IN(?)「,@ members.collect {| m | m.id}]' – aaronrussell 2010-10-18 14:16:10

0

如果您使用的是Rails 3,我建議您查看一下新的ActiveRecord查詢語法。有一個概述在http://guides.rubyonrails.org/active_record_querying.html

我很確定你可以做你要做的,而不用寫任何SQL。在該頁面的「分組」部分中有一個與您正在嘗試執行的操作類似的示例。

+0

謝謝,雖然這個應用程序是一個傳統的2.3。*應用程序,所以不能使用新的語法,我害怕。 – aaronrussell 2010-10-19 09:41:55