基于多列分数总和分组MySQL查询结果(CodeIgniter 4.4)
在CodeIgniter 4.4中实现学生总分多类别分组查询
方法一:查询所有学生后在PHP中分组处理
这种方式灵活度高,适合需要自定义复杂分组规则或后续要对分组数据做更多处理的场景。
步骤1:查询所有学生及总分
先修正你原有代码的语法问题(select参数需用字符串包裹,无需多余的groupBy),获取所有学生的完整数据和总分:
// 假设你的Model对应学生表,比如StudentModel $this->select('stdID, stdName, (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) as total'); $allStudents = $this->findAll();
步骤2:定义分组规则并分配学生
提前设定好分组的条件和名称,然后遍历学生数据分配到对应分组:
// 定义分组规则,可根据需求添加/修改 $groupRules = [ '总分>70' => function($total) { return $total > 70; }, '总分=50' => function($total) { return $total == 50; }, '总分<50' => function($total) { return $total < 50; }, '其他分数段' => function($total) { return $total >=50 && $total <=70; } ]; // 初始化分组结果数组 $groupedResult = []; foreach (array_keys($groupRules) as $groupName) { $groupedResult[$groupName] = []; } // 遍历学生,分配到对应分组 foreach ($allStudents as $student) { $totalScore = $student['total']; foreach ($groupRules as $groupName => $condition) { if ($condition($totalScore)) { $groupedResult[$groupName][] = $student; break; // 每个学生仅归属一个分组,若允许多归属可删除此行 } } }
使用结果
此时$groupedResult就是按类别分组后的学生数据,比如要获取总分>70的学生:
$gt70Students = $groupedResult['总分>70'];
方法二:通过SQL CASE语句实现分组
利用MySQL的CASE表达式直接在查询中标记学生的分组类别,可选择获取分组后的详细数据或统计数量。
场景1:获取带分组标记的所有学生
直接查询时给每条记录添加分组类别,再在PHP中整理:
$this->select(' stdID, stdName, (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) as total, CASE WHEN (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) > 70 THEN "总分>70" WHEN (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) = 50 THEN "总分=50" WHEN (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) < 50 THEN "总分<50" ELSE "其他分数段" END as group_category '); $studentsWithGroup = $this->findAll(); // 按分组类别整理数据 $groupedData = []; foreach ($studentsWithGroup as $std) { $category = $std['group_category']; if (!isset($groupedData[$category])) { $groupedData[$category] = []; } $groupedData[$category][] = $std; }
场景2:直接统计各分组的学生数量
如果只需要每个类别的学生总数,可通过GROUP BY直接查询:
$this->select(' CASE WHEN (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) > 70 THEN "总分>70" WHEN (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) = 50 THEN "总分=50" WHEN (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) < 50 THEN "总分<50" ELSE "其他分数段" END as group_category, COUNT(*) as student_count '); $this->groupBy('group_category'); $groupCounts = $this->findAll();
内容的提问来源于stack exchange,提问作者Ab-Sadiq
相关产品推荐
相关产品推荐

