得到学生的等级

时间:2015-05-29 08:56:42

标签: php

我试图通过使用总分来获得学生的等级,即标记高于另一个的学生应该是第一个,依此类推,我使用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";  
?>

3 个答案:

答案 0 :(得分:3)

保留当前的代码,但在循环之外再添加一个变量,再添加一个以保持当前分数:

$current_rank = 1;
$current_score = null;

在循环内部检查总数是否与您保留的总数相同,如果它们不同,则将等级分配给当前等级:

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

始终显示$ current_rank,只有当它与前一次迭代不同时才会更改,并且在每次迭代结束时,也会更新$current_score

$current_score = $row['total'];

我希望这会有所帮助。

答案 1 :(得分: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++;
    }
}

答案 2 :(得分: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>";  
?>