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
相关产品推荐
相关产品推荐

