我尝试使用汇总AVG()
来返回查询的平均值。
当我这样做时
$values = Model::orderBy('columnA', 'desc')
->select('value')
->where('ColumnB', '50')
->where('ColumnC', '<=','10')
->Take(5)
->get()
$arr = array_flatten($values)
//returns array(78, 73, 81, 83, 74)
//Average roughly to 77.8
我的目标是达到77.8的平均值
但是,当我将get()
更改为avg('value')
$values = Model::orderBy('columnA', 'desc')
->select('value')
->where('ColumnB', '50')
->where('ColumnC', '<=','10')
->Take(5)
->avg('value')
//Returns 69.5
我注意到我可以删除take()
它不会更改avg()
返回的值,这是奇怪的,因为我有超过5条与此查询对应的记录。我的猜测是平均值是根据我想要的更多行计算的。
如何轻松制作第一个查询返回的值的平均值?
答案 0 :(得分:2)
AVG()是不带LIMIT参数的聚合函数,因此Builder的take(5)方法在这里没有效果。
您可以在仅检索5行的子查询上运行avg:
$subquery = Model::select('value')
->whereRaw('ColumnB = 50')
->whereRaw('ColumnC <= 10')
->Take(5)
->toSql();
$average = DB::table(DB::raw(" ($subquery) as sub "))->avg('value');