通过对常见结果进行分组,将Laravel查询生成器计为COUNT

时间:2018-03-01 02:11:44

标签: php mysql laravel laravel-query-builder

我正在建立的应用程序允许教师评估他们的学生。他们可以在任意数量的班级中拥有任意数量的学生。 (例如,A老师可能只教一门25名学生,但老师B可以教授4门30名学生7门不同科目。)我的最终目标是为教师绘制任何选定班级的表现数据。这就是图表的样子:An example of the data, displayed visually.

我有一个包含一系列数据的MySQL表。它的结构如下所示:

id   user_id  room_id  student_id  subject_id  unit_id  outcome_id  assessed_level
200  28       50       69          23          203      849         4
201  28       50       66          23          203      849         3
202  28       50       76          23          203      849         2
203  28       50       69          23          212      849         4
204  28       50       66          23          212      849         1
205  28       50       76          23          212      849         3

etc.

在一个视图中,我想抓住每个科目的所有学生,并确定1-4作为他们的分数的平均值达到了多少。他们可能已经在一个主题中被评估了很多次,我需要输出所选课堂上教授的所有科目的数据,所以我确定我需要在整个循环中运行它。

我使用以下内容获取数据:

for($x=0; $x<count($students_of_room); $x++) {
    $assessment_data[] = DB::table('student_assessments') 
        ->join('subjects', 'student_assessments.subject_id', '=', 'subjects.id')
        ->select('student_assessments.student_id as student_id', 'subjects.name as subject_name', DB::raw('round(avg(student_assessments.assessed_level)) AS average')) 
        ->where('student_assessments.user_id', Auth::id()) 
        ->where('student_assessments.room_id', $selected_room->id) 
        ->where('student_assessments.student_id', $students_of_room[$x]->id) 
        ->groupBy('student_assessments.subject_id')
        ->get();
}

产生这些结果:

  

[{&#34; student_id数据&#34; 69&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 4&#34 ;}]   [{&#34; student_id数据&#34;:66,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34; 76&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 2&#34;}]   [{&#34; student_id数据&#34;:67,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:64,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:68,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 2&#34;}]   [{&#34; student_id数据&#34;:75,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:73,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:74,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 2&#34;}]   [{&#34; student_id数据&#34;:70,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:65,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:62,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 2&#34;}]   [{&#34; student_id数据&#34;:63,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:71,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 3&#34;}]   [{&#34; student_id数据&#34;:72,&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;平均&#34;:&#34; 1&#34;}]

我希望能够将这些结果组合在一起,以便所有平均为4的学生在一起,3s在一起,2s和1s。

从上面的示例输出中,我将有一名学生 4 ,9名学生 3 ,4名学生 2 和1名 1 的学生。

我希望它看起来像这样:

  

[{&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;电平&#34;:&#34; 4&#34;&#34; num_students&#34 ;: &#34; 1&#34;}]   [{&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;电平&#34;:&#34; 3&#34;&#34; num_students&#34;:&#34 ; 9&#34;}]   [{&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;电平&#34;:&#34; 2&#34;&#34; num_students&#34;:&#34 ; 4&#34;}]   [{&#34; SUBJECT_NAME&#34;:&#34;科学&#34;&#34;电平&#34;:&#34; 1&#34;&#34; num_students&#34;:&#34 1#34;}]

我怎么能得到这个结果?

此外,如果还有其他问题我的代码可以改进,我也对此持开放态度。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为以下查询会给你第一个结果,请试一试。

DB::table('student_assessments')
->join('subjects', 'student_assessments.subject_id', '=', 'subjects.id')
->where('student_assessments.user_id', Auth::id()) 
->where('student_assessments.room_id', $selected_room->id)
->select('student_assessments.id','subject.name as subject_name','subject.id as subject_id',DB::raw('round(avg(student_assessments.assessed_level)) AS average'))
->groupBy('subject_id','id')
->get();