2015-05-29 59 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++; 
    } 
}