Php 计算学生等级

Php 计算学生等级,php,rank,Php,Rank,我通过此链接遵循了前面的问题和答案: 遗憾的是,我没能得到我预期的结果。 预期结果: id score rank 1 78 4 2 80 3 3 100 1 4 88 2 5 56 5 在数据库中,我的表中有id score:result。 现在,我尝试的是把排名放在表中 我的代码如下: <?php include ('config.php'); ?> <!DOCTYPE html> <html>

我通过此链接遵循了前面的问题和答案:

遗憾的是,我没能得到我预期的结果。 预期结果:

id  score rank
 1   78    4
 2   80    3
 3   100   1
 4   88    2
 5   56    5
在数据库中,我的表中有id score:result。 现在,我尝试的是把排名放在表中

我的代码如下:

<?php
include ('config.php');
?>

<!DOCTYPE html>
<html>
    <head>
        <title>ranking</title>       
    </head>
    <body>
        <?php
            if($db){
                //Create Query
                $sql = "SELECT * FROM result ORDER BY score DESC";

                //Execute Query
                $result = mysqli_query($db,$sql);


                if($result -> num_rows > 0){                  

                    //output data for each row
                    echo " 
                        <br><br>                        
                        <table align='center'; border=1; style='text-align:center'>
                            <tr>
                                <td colspan='4'>RANKING TABLE</td>
                            </tr>

                            <tr>
                                <th>Bil</th>
                                <th>ID</th>
                                <th>Result</th>
                                <th>Rank</th>
                            </tr>
                        ";

                    $i = 0;
                    //Store rows by rank + get the last_id_rank from the first row
                    $by_ranks = array();
                    $last_id_rank = FALSE;

                    //Display Result
                    while($row = $result -> fetch_assoc()){
                        $i++;

                        echo " 
                            <tr>
                                <td>".$i."</td>
                                <td>".$row["id"]."</td>
                                <td>".$row["score"]."</td>
                                <td>".$row["rank"]."</td>
                            </tr>
                        ";

                        $by_ranks[$row["rank"]][]=$row;
                        if($last_id_rank === FALSE){
                            $last_id_rank = $row["rank"];
                        }
                    }

                    //Get the result
                    $get_results = function($by_ranks, $last_id_rank){
                        //Get sorted array that's smaller $last_id_rank
                        $ranks = array_filter(array_keys($by_ranks),function($var) use ($last_id_rank){
                            return $var < $last_id_rank;
                        });
                        rsort($ranks); //Sort ranks by DESC

                        //Get rank that is just smaller than $last_id_rank
                        if(sizeof($ranks) == 0){
                            return array();
                        }
                        else{
                            return $by_ranks[$ranks [0]];
                        }
                    };

                    $results = $get_results($by_ranks,$last_id_rank);

                    //Display results
                    foreach($results as $row){
                        echo "
                            <br><br><br><br>
                            <tr>
                                <td>{$row["id"]}</td>
                                <td>{$row["score"]}</td>
                                <td>{$row["rank"]}</td>
                            </tr>
                        ";
                    }                 


                    echo "
                        </table>
                    ";
                }
            }
            else{
                echo "Failed to connect";
                mysqli_close($db);
            }
        ?>
    </body>
</html>

根据您的表结构,您可以更新该表,使其具有以下秩值:

UPDATE result
LEFT JOIN result AS sub
 ON sub.score > result.score
SET rank = COUNT(sub.id) + 1
左连接与表中的其他行进行比较,并将排名设置为分数较高的计数加上1,则排名从1开始,而不是从0开始。另外,如果你想让领带的排名最低,只需将sub.score>result.score更改为use>=


数据就位后,只需从SQL查询结果中访问php中的秩值,而无需进行动态计算。

要从仅包含id和分数的表中创建所需的结果,可以执行以下操作

select * from(
 select id,score,(@rank:=@rank+1) as rank 
 from tbl 
 cross join
 ( select @rank:=0 ) T1
 order by score desc
) T2
order by id
;
导致

id  score   rank
1   78      4
2   80      3
3   100     1
4   88      2
5   56      5

所以你们在数据库中并没有rank字段,你们只想在php中输出它,对吗?我在数据库中有rank字段,但数据库中还并没有任何数字。希望在数据库中输出排名并在php中显示。因此,用一些类似这样的速记方式?//从表中按分数顺序选择*DESC$i=0;foreach$results as&$result{$i++;$result['rank']=$i;$db->queryUPDATE OURTABLE SET rank='.$result['rank'].'其中id=.$result['id'];}您的代码显示了从数据库返回的等级。您首先错过了计算它并在创建表之前更新要运行的数据库以更新dataSorry的部分,我对这句语句“$results as&$results”感到非常困惑,这不是冲突吗?因为我的代码$result=mysqli_query$db,$sql;已用于根据分数进行排序。我在SQL phpMyadmin中尝试了此代码。错误如下:1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,了解在第3Ah行使用接近“LEFT JOIN result AS sub ON sub.score>result.score”的正确语法,这是我的错误,我将集合放在了连接之前。好的,没关系。无论如何,谢谢^^
id  score   rank
1   78      4
2   80      3
3   100     1
4   88      2
5   56      5