我目前有一个功能:
Score::whereIn('site_id', $sites)
->where('type', 1)
->avg('score');
但目前,正如您所看到的,它在Scores表中的所有结果中取平均值。我想只对每个$site_id
的最新行进行平均(尽管表中可能没有所有$ site_id')。
该表格有一个created_at
列,它将根据日期/时间确定哪一个是最新的。
答案 0 :(得分:0)
使用orderBy('created_at', 'DESC')
并使用take(15)
限制结果。这将占据您表中最近的15条记录。
Score::whereIn('site_id', $sites)
->where('type', 1)
->orderBy('created_at', 'DESC')
->take(15)
->avg('score');
答案 1 :(得分:0)
您可以添加groupBy
:
Score::whereIn('site_id', $sites)
->where('type', 1)
->orderBy('created_at', 'desc')
->groupBy('site_id')
->avg('score');
答案 2 :(得分:0)
我不确定使用Laravel的活动记录样式查询构建器有一种简单的方法。
我一直在做这样的事情,它需要一个子查询或临时表,因为GROUP BY(特别是在MySQL中)将遵守ORDER BY AFTER 分组完成,这意味着您无法保证预先分组为分组选择的值是符合您的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的活动记录样式查询构建器执行此操作是我必须要查看是否有可能。可能只需要运行原始查询。但我想我会先发布方法,看看它是否在继续深入研究之前是否合理。