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