2015-05-29 51 views
2

我想通过使用总分来获得学生的排名,也就是比其他分数更高的学生应该是第一个等,我使用while循环来这样做,但是当两个或更多的学生有相同的总分数,他们得到不同的等级,我想要达到的是当两个或两个以上的学生有相同的总分,他们应该有相同的排名,请帮助,这里是我的代码。获得学生排名

<?php require_once("include/connection.php"); ?> 
<?php 
$query = "SELECT * FROM `total` ORDER BY `total` DESC"; 
$result = mysql_query($query) or die(mysql_error()); 
$rank = 1; // initialize 
echo "<table><tr><th>Student Code</th><th>Rank</th><th>Total</th></tr>\n"; 
while($row = mysql_fetch_assoc($result)) 
{ 
    echo "<tr><td>{$row['student_code']}</td><td>$rank</td><td>{$row['total']}</td></tr>\n"; 
    if ($rank == 100) 
    { break; } 
    $rank++; 
} 
echo "</table>\n"; 
?> 

回答

0

请使用mysqli_*功能mysql_*功能都很老了

<?php 
require_once("include/connection.php"); 
$query = "SELECT * FROM `total` ORDER BY `total` DESC"; 
$result = mysql_query($query) or die(mysql_error()); 

$rank = $previous = 0; 

echo "<table><tr><th>Student Code</th><th>Rank</th><th>Total</th></tr>"; 

while($row = mysql_fetch_assoc($result)) 
{ 
    // break statement at the end has no effect since you are doing echo on top. 
    if ($rank == 100)break; 

    // If same total will skip $rank++ 
    if($row['total'] != $previous)$rank++; 

    echo "<tr><td>".$row['student_code']."</td><td>$rank</td><td>".$row['total']."</td></tr>"; 

    // Current row student's total 
    $previous = $row['total']; 
} 
echo "</table>"; 
?> 
+0

感谢,我想这和它的工作完美 – punji

+0

我将迁移到mysqli的,但我仍然不是很好在PHP中,我还在学习php和mysql的基础 – punji

+0

很高兴听到,祝你有个美好的一天,不要忘记考虑接受,如果你对给定的答案感到满意。 –

3

保留目前的代码,但添加这样循环的一个多变量之外多一个保持目前的得分:

$current_rank = 1; 
$current_score = null; 

在循环内进行检查,看是否总计是

if ($current_score != $row['total']) 
{ 
    $current_rank = $rank; 
} 

始终显示$ current_rank这只会改变,如果它是不同的F:与一个你保留,如果他们是不同的,然后分配秩当前等级相同ROM前一个,并在每个迭代结束,更新$current_score还有:

$current_score = $row['total']; 

我希望这有助于。

2

你需要考虑学生的“总数”。

首先,如果你只想要100条记录,你可以限制它的SQL,那将是比经过100次迭代循环的中断更高效:

$query = "SELECT * FROM `total` ORDER BY `total` DESC LIMIT 100"; 

认为,如果你有10,000名学生,你会收回9,900名学生。

然后,while循环可以改变这样的:

$rank = 1; 
$lastTotal = 0; 
while($row = mysql_fetch_assoc($result)) 
{ 
    echo "<tr><td>{$row['student_code']}</td><td>$rank</td><td>{$row['total']}</td></tr>\n"; 
    if ($lastTotal == 0) { 
     $lastTotal = $row['total']; // First time that $lastTotal is set. 
    } 
    if ($lastTotal > $row['total']) { 
     $lastTotal = $row['total']; 
     $rank++; 
    } 
} 

利用这一点,你会增加排名仅在当前学生的排名比他以前的学生低。 如果您知道您的最大总价值,那么您可以删除第一次,如果该检查是第一次设置$ lastToal的话。如果是这样,例如它是100,只需将它设置在$ lastTotal = 100中,并在while循环内删除第一个。

$rank = 1; 
$lastTotal = 100; 
while($row = mysql_fetch_assoc($result)) 
{ 
    echo "<tr><td>{$row['student_code']}</td><td>$rank</td><td>{$row['total']}</td></tr>\n"; 
    if ($lastTotal > $row['total']) { 
     $lastTotal = $row['total']; 
     $rank++; 
    } 
}