我正在建立的应用程序允许教师评估他们的学生。他们可以在任意数量的班级中拥有任意数量的学生。 (例如,A老师可能只教一门25名学生,但老师B可以教授4门30名学生7门不同科目。)我的最终目标是为教师绘制任何选定班级的表现数据。这就是图表的样子:
我有一个包含一系列数据的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;}]
我怎么能得到这个结果?
此外,如果还有其他问题我的代码可以改进,我也对此持开放态度。谢谢!的
答案 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();