我的代码对学生进行排名,但不按我的意图进行排名 - 如果两个或多个学生得分相同的score
,则不会在同一rank
中rank
。我希望最终排名是这样的 - 如果两个或多个学生score
相同的结果,我希望他们在这样的地方 rank
:
1. miki ==> 97.8
2. lisa ==> 96.1
2. jack ==> 96.1
4. john ==> 90.7
请注意,Lisa和Jack score
相同(96.1
(,它给了它们相同的rank
(第二(,因此跳过了第三名。约翰是第四。
当前代码
$student = '10_E';
$first = mysql_query("SELECT * FROM rej_students where student_selected = '$student'");
$teacher = mysql_query("SELECT * FROM teachers WHERE tech_id = '1002'");
$teachers = mysql_fetch_array($teacher);
$avg = mysql_query("SELECT * FROM avgfct_10 order by AVGFCT_10 desc");
$ra = 0; //rank
while ($go = mysql_fetch_array($avg))
{
if ($go['AVGFCT_10'] != $go['AVGFCT_10'])
{
$micky = $ra ++;
}
if ($go['AVGFCT_10'] == $go['AVGFCT_10'])
{
$micky = 'same';
}
echo "id = " . $go['STUDENT_ID'] . "<br> AVARANGE = " . $go['AVGFCT_10'] . "<br>RANK = " . $micky . "<br> Class = " . $teachers['tech_hclass'] . "<br><br>";
}
您需要两个计数器
- 绝对计数器(总是1、2、3、4、5等(。
- 排名计数器 - 它从1起,但是如果得分相同,则不会更新。一旦分数不同,它将使用
absolute counter
更新。
示例代码
$counter = 1; // init absolute counter
$rank = 1; // init rank counter
// initial "previous" score:
$prevScore = 0;
while ($go = mysql_fetch_array($avg))
{
// get "current" score
$score = $go['AVGFCT_10'];
if ($prevScore != $score) // if previous & current scores differ
$rank = $counter;
// else //same // do nothing
echo "Rank: {$rank}, Score: {$score}<br>";
$counter ++; // always increment absolute counter
//current score becomes previous score for next loop iteration
$prevScore = $score;
}
输出:
Rank: 1, Score: 97.8
Rank: 2, Score: 96.1
Rank: 2, Score: 96.1
Rank: 4, Score: 90.7