Laravel中如何在select()内结合条件SQL使用count()统计学生成绩?
Laravel DB查询:按学生统计挂科次数与总分
嘿,我看你现在在Laravel里用DB类关联学生和成绩表,想要统计每个学生的姓名、ID、挂科次数(is_failed=1的次数)以及总分对吧?先给你指出当前查询里的几个小错误:你写的表名是users和contacts,但实际你的表是students和students_marks,关联字段也写错了,应该是students.id = students_marks.student_id。
接下来给你整理正确的查询方式,核心是在select()里结合CASE WHEN和聚合函数来实现条件统计:
基础查询(只统计有成绩记录的学生)
$studentStats = DB::table('students') ->join('students_marks', 'students.id', '=', 'students_marks.student_id') ->select( 'students.id as student_id', 'students.name as student_name', // 统计is_failed=1的次数,只有符合条件的记录才会被计数 DB::raw('COUNT(CASE WHEN students_marks.is_failed = 1 THEN 1 END) as count_failed'), // 计算该学生的所有成绩总分 DB::raw('SUM(students_marks.marks) as total_marks') ) // 按学生ID和姓名分组,确保同一个学生的所有成绩被聚合到一起 ->groupBy('students.id', 'students.name') ->get();
进阶查询(包含无成绩记录的学生)
如果有的学生还没有任何成绩记录,你想让他们的挂科次数显示为0、总分显示为0,可以把join改成leftJoin,同时用COALESCE处理null值:
$studentStats = DB::table('students') ->leftJoin('students_marks', 'students.id', '=', 'students_marks.student_id') ->select( 'students.id as student_id', 'students.name as student_name', DB::raw('COUNT(CASE WHEN students_marks.is_failed = 1 THEN 1 END) as count_failed'), // 如果SUM(marks)为null(无成绩记录),则返回0 DB::raw('COALESCE(SUM(students_marks.marks), 0) as total_marks') ) ->groupBy('students.id', 'students.name') ->get();
结果说明
运行上面的查询后,你会得到符合预期的统计数据,比如:
- John Doe(ID1)的挂科次数是1,总分是66
- Mark P(ID2)的挂科次数是2,总分是85
- Pen Henry(ID3)如果用进阶查询的话,挂科次数0,总分0
内容的提问来源于stack exchange,提问作者Mohammed Sabir
相关产品推荐
相关产品推荐

