我正在尝试使用聚合 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 个对应的记录到这个查询。我的猜测是平均值是根据我想要的大量行计算的。
我如何轻松地计算第一个查询返回的值的平均值?
最佳答案
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');
关于php - Laravel AVG 没有返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23087981/