我現在有一個功能:Laravel雄辯 - 使用時獲取最新的行,其中功能
Score::whereIn('site_id', $sites)
->where('type', 1)
->avg('score');
但此刻,你可以看到,它的平均得分情況表中進行之中所有結果。我只想對每個$site_id
的最近一行進行平均(儘管結果可能不是所有的$ site_id)。
該表有一個created_at
列,它將確定哪個是按日期/時間最新的。
我現在有一個功能:Laravel雄辯 - 使用時獲取最新的行,其中功能
Score::whereIn('site_id', $sites)
->where('type', 1)
->avg('score');
但此刻,你可以看到,它的平均得分情況表中進行之中所有結果。我只想對每個$site_id
的最近一行進行平均(儘管結果可能不是所有的$ site_id)。
該表有一個created_at
列,它將確定哪個是按日期/時間最新的。
您可以添加groupBy
:
Score::whereIn('site_id', $sites)
->where('type', 1)
->orderBy('created_at', 'desc')
->groupBy('site_id')
->avg('score');
謝謝你的回覆。您提出的修正案不會讓我成爲每個網站的最新行,但它會嗎?它只會將site_id的結果分組? – Ben
對不起,請檢查最新的一個。忘記添加訂單了。我檢查了我的結果,它工作。 –
@Ben:它對你有用嗎? –
我不知道,有一個簡單的方法與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的活動記錄樣式查詢生成器來做這件事,我不得不去查看它是否可能。可能需要運行原始查詢。但我想我會發布方法,以便在進一步挖掘之前看看它是否聽起來很健康。
謝謝您的回覆。爲什麼使用 - >採取(15)? site_id的數量是動態的,可以是1或300.我想獲取所有site_ids的最新行。 – Ben
@你能解釋一下嗎?也許發佈你的表的模式。你想得到'site_id'在'$ sites'(我假設是一個ID數組)的最近記錄(多少?)的平均得分? –
我想獲得每個site_id的最新行的平均分數。是的,這是一組ID。所以我希望SQL獲取每個ID的最新行並將其平均值。 – Ben