php - Laravel AVG 没有返回正确的值

标签 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 个对应的记录到这个查询。我的猜测是平均值是根据我想要的大量行计算的。

我如何轻松地计算第一个查询返回的值的平均值?

最佳答案

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/

相关文章:

带有 wrapText 的合并单元格上的 PHPExcel 行自动高度

php - 阿拉伯文文本存储为 "???"

rest - 如何在laravel api客户端上使用模型进行api调用?

php - 使用 Codeception 和 Laravel 进行登录测试

php - 在 PHP 中为设置长度 URL 缩短设计一个好的哈希函数

php - 如何将图像从文件夹保存到数据库

php - CSV 到 MYSQL PHP

mysql - 如何修复程序中的 "ambiguous"where 子句

unit-testing - laravel 4 mock 模拟模型关系

php - 动态 HTML 的 DOMXPath 查询