Laravel查询生成器通过分组常见结果来计算COUNT

问题描述 投票:0回答:1

我正在建立的应用程序允许教师评估他们的学生。他们可以在任意数量的班级中拥有任意数量的学生。 (例如,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();
}

产生这些结果:

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

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

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

我希望它看起来像这样:

[{“subject_name”:“科学”,“级别”:“4”,“num_students”:“1”}] [{“subject_name”:“科学”,“级别”:“3”,“num_students”:“ 9“}] [{”subject_name“:”科学“,”等级“:”2“,”num_students“:”4“}] [{”subject_name“:”科学“,”等级“:”1“,” num_students “:” 1" }]

我怎么能得到这个结果?

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

php mysql laravel laravel-query-builder
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.