Php 从laravel 4中的数据库获取平均值
我有两张表格:工作计划和进度。这是工作计划表 工作计划表: 身份证 分部名称 科长 进度表: 身份证 得分 工作计划id外键 这里workplan_id是workplan表的外键 现在我想通过分区名称对进度表分组得到平均值。但我的问题真的搞砸了。我所做的是:Php 从laravel 4中的数据库获取平均值,php,mysql,sql,laravel-4,average,Php,Mysql,Sql,Laravel 4,Average,我有两张表格:工作计划和进度。这是工作计划表 工作计划表: 身份证 分部名称 科长 进度表: 身份证 得分 工作计划id外键 这里workplan_id是workplan表的外键 现在我想通过分区名称对进度表分组得到平均值。但我的问题真的搞砸了。我所做的是: $report = DB::table('workplans') ->join('progress','workplans.id','=','progress.workplan_id') ->avg('pro
$report = DB::table('workplans')
->join('progress','workplans.id','=','progress.workplan_id')
->avg('progress.score')
->groupBy('workplans.division_name')
->get();
dd($report);
我不知道如何使用Laravel的查询生成器编写,但静态MySQL查询可能更容易:
$report = DB::select("SELECT AVG(progress.score) AS 'avg' FROM workplans JOIN progress ON workplans.id=progress.activity_id GROUP BY workplans.division_name;");
尝试通过原始选择执行此操作:
$report = DB::table('workplans')
->join('progress','workplans.id','=','progress.activity_id')
->select(DB::raw('avg(progress.score) as avg_progress_score'))
->groupBy('workplans.division_name')
->get();
您想要的SQL是这样的
SELECT workplans.division_name, AVG(progress.score) as average_score
FROM `workplans`
LEFT JOIN `progress` ON progress.workplan_id = workplans.id
GROUP BY workplans.id
使用laravel查询生成器
$report = DB::table ('workplans')
->join ('progress', 'progress.workplan_id', '=', 'workplans.id')
->select ('workplans.division_name', DB::raw ('AVG(progress.score) as average_score'))
->groupBy ('workplans.id')
->get ();
所以对于分数为5分和15分的1区,分数为15分和25分的2区,这个返回
Array
(
[0] => stdClass Object
(
[division_name] => Division 1
[average_score] => 10
)
[1] => stdClass Object
(
[division_name] => Division 2
[average_score] => 20
)
)
查询的问题是,avg aggregate函数返回表中所有列的平均值,而不是返回查询的引用,以便继续链接其他函数。解决方法是使用DB::raw方法使用MySQL AVG函数手动指定平均值。您的连接使用progress.activity\u id,但您说外键是workplan\u id。只是为了检查这是否是您刚才犯的错误,或者这是否是您遇到麻烦的原因!!我的坏消息是,我刚刚编辑了itAlso,以便访问->选择(DB::raw('avg(progress.score)as averageScore'))Thanx mate以获得帮助!!