You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:29:04