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

PHP中根据自定义计算总分对三表关联查询结果排序方法

问题说明

你当前代码无法按总分排序的核心原因是:排序逻辑写在数据查询完成之后。SQL执行时就已经按照raport_mtk、raport_bindo字段完成了结果排序,后续在PHP循环中计算的$total无法反向修改数据库已经返回的结果顺序,自然达不到预期排序效果。
另外你原代码的总分计算存在括号优先级错误:现有写法下0.75的权重仅会作用在psikotest分数上,0.25的权重仅会作用在npa分数上,并非对应分组所有分数的和乘权重,如果不符合你的业务预期需要调整括号位置。

可行方案

方案1:SQL层直接计算排序(优先推荐)

性能最优的实现方式是把总分计算逻辑直接写入SQL语句,在数据库查询阶段就完成总分计算和排序,不需要PHP额外处理:

// 注意:原SQL的WHERE条件`klasifikasi.id_klasifikasi`缺少判断逻辑,请根据实际业务补全,例如`klasifikasi.id_klasifikasi > 0`
$sql = "SELECT *,
    (
        (
            klasifikasi.raport_mtk/7 +
            klasifikasi.raport_bindo/7 +
            klasifikasi.raport_bing/7 +
            klasifikasi.raport_ipa/7 +
            klasifikasi.un_mtk/7 +
            klasifikasi.un_ipa/7 +
            klasifikasi.psikotest/7
        ) * 0.75
    ) - (
        (
            klasifikasi.raport_ips/4 +
            klasifikasi.un_bindo/4 +
            klasifikasi.un_bing/4 +
            klasifikasi.npa/4
        ) * 0.25
    ) AS total
FROM klasifikasi
JOIN siswa ON siswa.id_siswa = klasifikasi.id_siswa
JOIN prodi ON prodi.id_prodi = siswa.id_prodi
WHERE klasifikasi.id_klasifikasi
ORDER BY total DESC";

$query = mysqli_query($konek, $sql);
// 此时返回的结果已经按总分从高到低排序,直接循环读取即可,$dataku['total']就是计算好的总分
while ($dataku = mysqli_fetch_array($query)) {
    // 你的后续业务逻辑
}

如果你的业务逻辑确实是仅给psikotest、npa两项单独乘权重,只需要把SQL中对应分组的外括号去掉即可。

方案2:PHP层数组二次排序

如果总分计算逻辑过于复杂,不适合直接写在SQL中,可以先把所有查询结果存入PHP数组,计算完每条数据的总分后,再通过数组排序函数重新排序:

$resultList = [];
$query = mysqli_query($konek,"select * from klasifikasi join siswa on siswa.id_siswa=klasifikasi.id_siswa join prodi on prodi.id_prodi=siswa.id_prodi where klasifikasi.id_klasifikasi");
while ($dataku = mysqli_fetch_array($query)) {
    // 计算总分,括号逻辑同方案1,根据你的实际业务调整
    $total = (
        (
            $dataku['raport_mtk']/7 +
            $dataku['raport_bindo']/7 +
            $dataku['raport_bing']/7 +
            $dataku['raport_ipa']/7 +
            $dataku['un_mtk']/7 +
            $dataku['un_ipa']/7 +
            $dataku['psikotest']/7
        ) * 0.75
    ) - (
        (
            $dataku['raport_ips']/4 +
            $dataku['un_bindo']/4 +
            $dataku['un_bing']/4 +
            $dataku['npa']/4
        ) * 0.25
    );
    $dataku['total'] = $total;
    $resultList[] = $dataku;
}
// 按total字段倒序排序
usort($resultList, function($a, $b) {
    return $b['total'] <=> $a['total'];
});
// 遍历排序后的数组处理业务
foreach ($resultList as $dataku) {
    // 你的后续业务逻辑
}

内容的提问来源于stack exchange,提问作者Martinus Robinson Sumitro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:30:49