我已按照上一个问题通过以下链接回答: 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
答案 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