可能重复:
Mysql rank 函数
我正在制作一个排名网站,每个用户都会有一个基于级别的唯一排名。#1 是最好的排名,因为有 350,000 名用户,所以最差的排名将是 #350000。
任何用户都不能拥有与其他任何人相同的排名。现在,当添加新用户时,会计算他们的级别。计算后,脚本将“重建”排名,逐个遍历每个用户,并计算他们的新排名。
以下是对查询的解释:
- “id”是成员在数据库中的ID
- “RankNum”是他们的等级。它需要重命名。
- “排名”是他们的唯一排名,#1 到 #350000。
这是我当前的脚本:
function RebuildRanks() {
$qD = mysql_query("SELECT `Id`,`RankNum` FROM `Members` ORDER BY `Rank` DESC, `Id` ASC");
$rowsD = mysql_num_rows($qD);
$curRank = 0;
for($x = 1; $x <= $rowsD; $x++) {
$rowD = mysql_fetch_array($qD);
$curRank++;
if($rowD['RankNum'] != $curRank) {
if($curRank != 0) {
mysql_query("UPDATE `Members` SET `RankNum`='$curRank' WHERE `Id`='".$rowD['Id']."'");
}
}
}
return true;
}
对于 350,000 名用户,这往往会运行得很慢。本质上,在数据库中排名(“ORDER BY `Rank` DESC”)是他们的级别,因此查询将对他们进行排序。不幸的是,该过程的其余部分很慢。
以这种方式处理所有 350,000 个用户大约需要 97 秒。是否有任何可能的解决方案可以更有效、更快速地运行它?