2016-03-11 70 views
1

我現在有一個功能:Laravel雄辯 - 使用時獲取最新的行,其中功能

Score::whereIn('site_id', $sites) 
     ->where('type', 1) 
     ->avg('score'); 

但此刻,你可以看到,它的平均得分情況表中進行之中所有結果。我只想對每個$site_id的最近一行進行平均(儘管結果可能不是所有的$ site_id)。

該表有一個created_at列,它將確定哪個是按日期/時間最新的。

回答

0

使用orderBy('created_at', 'DESC')並將結果限制爲take(15)。這將採用表中最近的15條記錄。在take()orderBy()

Score::whereIn('site_id', $sites) 
     ->where('type', 1) 
     ->orderBy('created_at', 'DESC') 
     ->take(15) 
     ->avg('score'); 

文檔。

+0

謝謝您的回覆。爲什麼使用 - >採取(15)? site_id的數量是動態的,可以是1或300.我想獲取所有site_ids的最新行。 – Ben

+0

@你能解釋一下嗎?也許發佈你的表的模式。你想得到'site_id'在'$ sites'(我假設是一個ID數組)的最近記錄(多少?)的平均得分? –

+1

我想獲得每個site_id的最新行的平均分數。是的,這是一組ID。所以我希望SQL獲取每個ID的最新行並將其平均值。 – Ben

0

您可以添加groupBy

Score::whereIn('site_id', $sites) 
     ->where('type', 1) 
     ->orderBy('created_at', 'desc') 
     ->groupBy('site_id') 
     ->avg('score'); 
+0

謝謝你的回覆。您提出的修正案不會讓我成爲每個網站的最新行,但它會嗎?它只會將site_id的結果分組? – Ben

+0

對不起,請檢查最新的一個。忘記添加訂單了。我檢查了我的結果,它工作。 –

+0

@Ben:它對你有用嗎? –

0

我不知道,有一個簡單的方法與Laravel的活動記錄風格Query Builder來做到這一點。

所有的時間我做了這樣的事情,它需要一個子查詢或一個臨時表,因爲GROUP BY(特別是在MySQL中)會兌現之後分組完成,這意味着你無法保證預分組所選的值符合您的ORDER BY。

在這種情況下,我認爲你可能實際上需要2個子查詢:第一個是爲了分組排序,第二個是分組,因此每個site_id有1行,最後選擇做平均。如果你只做第一個子查詢,你將得到每個site_id的平均值,而不是所有site_id的平均值。

這裏是什麼,我認爲你正在尋找一個例子查詢:

SELECT AVG('score') FROM (
    SELECT * FROM (
     SELECT * FROM table_name ORDER BY created_at DESC 
    ) AS tbl GROUP BY site_id 
) AS tbl2; 

這是未經測試,但我認爲這是正確的一般。

......所有這一切都假設我正確地解釋了這個問題,希望我做到了。

我希望我有比2個子查詢更好的建議 - 如果其他人有更好的方式做這件事,我很樂意學習新的東西。

現在,使用Laravel的活動記錄樣式查詢生成器來做這件事,我不得不去查看它是否可能。可能需要運行原始查詢。但我想我會發布方法,以便在進一步挖掘之前看看它是否聽起來很健康。