2017-04-08 54 views
2

我有一個叫Event的模型,它屬於AreaTask。我正在嘗試檢索僅包含每個區域和任務組合中最新事件的事件集合。也就是說,我只想要最近發生的事件具有相同的area_id和task_id。事件示例集合:如何檢索每個列組合中最新的活動記錄對象?

|event_id|area_id|task_id| ... | 
|--------|-------|-------|-----| 
|  5 |  3 |  2 | ... | 
|  4 |  3 |  1 | ... | 
|  3 |  3 |  2 | ... | 

這裏我只想要事件5和4自3年齡以後返回。

我試過使用Event.select(:area_id,:task_id).distinct這似乎工作,但剝離返回的事件的所有其他屬性,包括:id。感謝任何幫助或建議!

+0

什麼數據庫您使用:此查詢

SELECT DISTINCT ON (area_id, task_id) events.* FROM events ORDER BY area_id ASC, task_id ASC, created_at DESC 

和Rails代碼? –

+0

MySQL 5.6.27(在AWS RDS上) – Ciryon

回答

2

您可以使用原始SQL裏面select,所以你可以嘗試這樣的事:

Event.select("DISTINCT(CONCAT(area_id, task_id)), id, attr1, attr2") 

idattr1attr2是從你的Event表中的其他屬性。

或者你可以使用.group代替.distinct,忘記使用原始SQL:

Event.all.group(:area_id,:task_id) 

你會得到相同的結果作爲使用DISTINCT和所有屬性將可用。

UPDATE

要分組之前訂購,您可以使用find_by_sql嵌套查詢(再次,原始SQL):

Event.find_by_sql(
    "SELECT * FROM (
    SELECT * FROM `events` 
    ORDER BY `events`.`created_at`) AS t1 
    GROUP BY t1.`area_id`, t1.`task_id`"; 
) 
+0

謝謝,這似乎不適用於我正在使用的MySQL:ActiveRecord :: StatementInvalid:Mysql2 :: Error:操作數應該包含1列:SELECT DISTINCT area_id,task_id),id FROM'events' – Ciryon

+0

你可以使用'CONCAT'將兩列轉換爲一列,並且工作正常。我更新了我的答案以考慮這一點,並且還使用'.group'(我更喜歡)添加了另一個解決方案。 – Gerry

+0

我嘗試了'.group'alternative,但它拿起了最古老的事件,我似乎無法在組之前下單。 – Ciryon

0

在您area_idtask_id需要羣體性事件換句話說,並在每個組中選擇最近的記錄。有關於爲這種情況構建sql-query的question。 PostgreSQL的版本爲您的桌面將是這樣的:

Event. 
    select("DISTINCT ON (area_id, task_id) events.*"). 
    order("area_id ASC, task_id ASC, created_at DESC") 
相關問題