Рассчитать рейтинг студента - PullRequest
0 голосов
/ 24 мая 2018

Я следовал за предыдущим вопросом и отвечаю по этой ссылке: Получить строку следующего по рангу до «ранга последнего идентификатора»?

К сожалению, я не смог получитьрезультат, как я и ожидал.Ожидаемый результат:

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 голосов
/ 24 мая 2018

Чтобы создать требуемый результат из таблицы, содержащей только идентификатор и оценку, вы можете сделать следующее:

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
0 голосов
/ 24 мая 2018

Учитывая вашу структуру таблицы, вы можете обновить таблицу, чтобы иметь значения ранга следующим образом:

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

Левое объединение выполняет сравнение с другими строками таблицы и устанавливает ранг для счетчика с помощьюболее высокий балл плюс один дает вам ранги, начинающиеся с 1 вместо 0. Кроме того, если вы хотите, чтобы связи получали самый низкий ранг, какой бы был у любого из них, просто измените sub.score> result.score, чтобы использовать> =

Когда у вас есть данные, вы можете просто получить доступ к значениям ранга в php из результата вашего SQL-запроса, и вам не нужно делать вычисления на лету.

...