基于多列数据总和的MySQL查询结果

92vpleto  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(155)

我有一个包含10列的表(stdID,stdName,score1,score2..... Score8)。
表中有超过100个学生记录(stdID),具有不同的分数(score1.... score8)。
我想要的是做一个查询,它将获取所有学生,并将结果按score1到score8的总和分组。
即我应该能够显示学生的类别,如:A.学生总成绩> 70 B.学生总成绩50等。
我用的是codeigniter 4.4
到目前为止,我可以做一个查询,获取一个类别:

$this->select(stdID,stdName, (score1 + score2 + ....score8) as total);
$this->groupBy(stdID);
$this->having(total > 70);
$this->findAll();

字符串
我使用foreach循环遍历结果,返回5个总分> 70的学生
但我真正想要的是多个类别的总分1至8分,而不仅仅是类别> 70。我不知道如何去请。

sd2nnvve

sd2nnvve1#

您可以获取所有学生记录及其总分数,然后使用PHP根据总分数范围将其分类到组中。以下是如何使用CodeIgniter的Query Builder完成的:

$query = $this->db->table('students')
                  ->select('stdID, stdName, (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) as total')
                  ->get();

$students = $query->getResult();

// Initialize categories
$categories = [
    'A' => [],
    'B' => [],
    // other categories
];

// Categorize students based on their total score
foreach ($students as $student) {
    if ($student->total > 70) {
        $categories['A'][] = $student;
    } elseif ($student->total >= 50 && $student->total <= 70) {
        $categories['B'][] = $student;
    }
    // handle other categories
}

字符串
此代码将给予一个关联数组$categories,其中每个键代表一个类别,值是属于该类别的学生的数组。您可以根据需要添加更多类别,方法是向$categories数组添加更多键,并向foreach循环添加更多代码。

fnatzsnv

fnatzsnv2#

为学生创建模型

class Student extends Model
{
    protected $table = 'students';

    public function getStudentsByScoreCategory()
    {
        $query = $this->db->table($this->table)
            ->select('stdID, stdName, (score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8) as total_score')
            ->groupBy('stdID')
            ->orderBy('total_score', 'DESC');

        return $query->get()->getResult();
    }
}

字符串
在控制器中访问方法

class YourController extends BaseController
{
    public function index()
    {
        $model = new Student();
        $data['students'] = $model->getStudentsByScoreCategory();

        return view('your_view', $data);
    }
}


然后将其显示在视图中

<?php foreach ($students as $student): ?>
    <?php
    $totalScore = $student->total_score;

    if ($totalScore > 70) {
        $category = 'A';
    } elseif ($totalScore > 50) {
        $category = 'B';
    } else {
        $category = 'C';
    }
    ?>

    <p>Student ID: <?= $student->stdID ?>, Name: <?= $student->stdName ?>, Total Score: <?= $totalScore ?>, Category: <?= $category ?></p>
<?php endforeach; ?>


如果score列是动态的(N个列),则可以将此getStudentsByScoreCategory()方法更改为

public function getStudentsByScoreCategory()
    {
        // Adjust N to the maximum score column index
        $N = 8;

        $scoreColumns = implode(' + ', array_map(function ($i) {
            return "score$i";
        }, range(1, $N)));

        $query = $this->db->table($this->table)
            ->select("stdID, stdName, ($scoreColumns) as total_score")
            ->groupBy('stdID')
            ->orderBy('total_score', 'DESC');

        return $query->get()->getResult();
    }

相关问题