Laravel AVG没有返回正确的价值

时间:2014-04-15 15:20:39

标签: php mysql laravel-4 aggregate-functions average

我尝试使用汇总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条与此查询对应的记录。我的猜测是平均值是根据我想要的更多行计算的。

如何轻松制作第一个查询返回的值的平均值?

1 个答案:

答案 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');