Рассчитать студенческий рейтинг

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

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

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

В базе данных у меня есть идентификатор, оценка в моей таблице: результат. Теперь то, что я пытаюсь, - это тоже поставить ранг в таблицу.

Мой код выглядит следующим образом:

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

person Chai Jin Ying    schedule 24.05.2018    source источник
comment
Итак, у вас нет поля ранга в базе данных, вы просто хотите вывести его в php, верно?   -  person Eakethet    schedule 24.05.2018
comment
У меня есть поле «ранг» в базе данных, но пока нет никакого номера в базе данных. Хотите иметь ранг (выход) в базе данных и отображать в php.   -  person Chai Jin Ying    schedule 24.05.2018
comment
Итак, в какой-то стенографии что-то вроде этого? // SELECT * FROM yourtable ORDER BY score DESC $i = 0; foreach ($results as &$result) { $i++; $результат['ранг'] = $i; $db-›query(UPDATE yourtable SET rank = ' . $result['rank'] . ' WHERE id = . $result['id']); }   -  person Eakethet    schedule 24.05.2018
comment
ваш код показывает ранг, возвращенный из базы данных. Сначала вы пропускаете часть, где вы вычисляете ее и обновляете базу данных (которая должна быть запущена перед созданием таблицы для обновления данных).   -  person Lelio Faieta    schedule 24.05.2018
comment
Извините, я немного запутался в этом утверждении «$results as &$results», не будет ли это конфликтом? так как мой код $result = mysqli_query($db,$sql); был использован для сортировки по счету.   -  person Chai Jin Ying    schedule 24.05.2018
comment
@Lelio Faieta, вы имеете в виду, что я должен сначала вычислить рейтинг, прежде чем вводить информацию в базу данных? Но разве не нужно сначала пройтись по предыдущему списку, чтобы можно было выпустить последний результат ранга, не так ли?   -  person Chai Jin Ying    schedule 24.05.2018
comment
вы просто печатаете то, что есть в вашей базе данных. Вы говорите, что ранг равен 0 в вашей базе данных, так как вы можете повторить реальный рейтинг? Вы должны вычислить это нет?   -  person Lelio Faieta    schedule 24.05.2018
comment
Хорошо, это то, что я пытаюсь обновить ранг. Но я действительно чувствую себя потерянным, чтобы создать расчет   -  person Chai Jin Ying    schedule 24.05.2018
comment
Вычисление и обновление рейтинга в базе данных можно выполнить с помощью одного запроса. Дайте мне пару минут, и я напишу, что я думаю.   -  person D. Kendall    schedule 24.05.2018


Ответы (2)


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

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-запроса, и вам не нужно выполнять вычисления на лету.

person D. Kendall    schedule 24.05.2018
comment
Я попробовал этот код в своем SQL (phpMyadmin). Вышла ошибка, как показано ниже: #1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с «LEFT JOIN result AS sub ON sub.score › result.score» в строке 3. - person Chai Jin Ying; 24.05.2018
comment
Ах, это была моя ошибка, я поставил set перед соединением. Починю - person D. Kendall; 24.05.2018
comment
Ничего страшного. В любом случае, спасибо ^^ - person Chai Jin Ying; 24.05.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
person webmite    schedule 24.05.2018