2017-09-15 82 views
1

我被困在愚蠢的事情中,但不知道該怎麼做,只要我想從列表數據庫中獲取所有數據的平均值我只是運行下面的代碼:獲取查詢中第一個N元素的平均值LARAVEL

Result::where('test_id', $test->id)->avg('grade') 

一個具體的例子,答案是37,現在,當我想要得到的前10行,我會運行此:

Result::select('grade')->where('test_id', $test->id) 
     ->orderBy('grade', 'asc')->limit(10)->get(); 

這一關當然會給我前10行,如果我使用計算器,並獲得平均分數,我會得到33,但如果我運行以下I:

Result::where('test_id', $test->id)->orderBy('grade','asc')->limit(10)->avg('grade'); 

我得到與總數據集相同的37。我很確定這是一件愚蠢的事情,但我無法弄清楚它是什麼。

+0

我編輯了彎引號關閉,去年「等級」的字符串,因爲我假設,如果這是在您的實際代碼,你會得到一個解析錯誤,而不是37 –

+0

是的,它是確定在實際的代碼中(複製粘貼問題),謝謝 –

回答

1

我有點猜測,因爲我沒有設置現在測試這個,但我在想的是,您使用的是builder avg method,它具有SQL聚合函數,而limit(10)是在聚合已經發生之後應用,並且只有一行。

我想如果你在得到有限的結果後做avg,那麼你將使用collection avg method代替,並且對10行中的查詢返回平均值。

Result::where('test_id', $test->id) 
     ->orderBy('grade','asc')->limit(10)->get()->avg('grade'); 
+0

嗯,這確實解決了這個問題,非常感謝,無論如何,當我嘗試使用一個非常大的數據集時,只是使用get()方法,不會讓事情變得有點慢,並且它使用了大量的內存。 –

+0

是的。對於只有十個項目,它可能不會有太大的差異,但除此之外,我一定會想辦法讓數據庫來做到這一點。 –

+0

我認爲這將涉及到使一個子查詢獲得有限的設置,然後做平均,但不幸的是我與Laravel查詢生成器有點生疏,所以我不知道如何從頂部做到這一點我的頭。 –