计算学生排名

时间:2018-05-24 13:21:59

标签: php rank

我已按照上一个问题通过以下链接回答: Fetch the row of next in rank to the “rank of last id”?

可悲的是,我无法按照预期得到结果。 预期结果:

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

在数据库中,我的表中有id,得分:结果。 现在,我正在尝试的是将排名放在表格中。

我的代码如下:

<?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>

我的数据库中的数据如下:

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

2 个答案:

答案 0 :(得分:0)

根据您的表结构,您可以使用以下内容更新表以获得排名值:

UPDATE result
LEFT JOIN result AS sub
 ON sub.score > result.score
SET rank = COUNT(sub.id) + 1

左连接与表中的其他行进行比较,并将排名设置为具有更高分数加1的排名,使得排名从1开始而不是0.此外,如果您希望关系获得最低排名,他们中的任何一个都会有,只需更改sub.score&gt; result.score使用&gt; =

一旦掌握了数据,您就可以从SQL查询的结果中访问php中的排名值,而不需要动态进行计算。

答案 1 :(得分:0)

要从仅包含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