我有一个包含用户和积分的数据库(实际上它是一个百分比,但这并不重要)。用户(S)与点的最高的数字是第一级,第二个第二级...使用积分计算排名
如果我这样做somethink这样我能得到一个$searchedUserID
的排名:
SELECT `user_id`, `points` FROM `usertable` ORDER BY `points` DESC
/** This function returns the rank of a user. The rank nr. 1 is the best.
* It is possible that some users share a rank.
*
* @param int $searchedUserID the ID of the user whose rank you would like to
* know
*
* @return int rank
*/
function getUserRank($searchedUserID)
{
$userArray = getAllUsersOrderedByPoints();
$rank = 0;
$lastPoints = -1; // Never happens
foreach ($userArray as $user) {
if ($user['point'] != $lastPoints) $rank++;
if ($user['user_id'] == $searchedUserID) break;
}
return $rank;
}
是不是有一种更直接的方式来获得(My)SQL? 如果不是的话:PHP部分可以改进吗?
(编辑:我可以存储由PHP直接在数据库中计算的排名......但是这将意味着我不得不做出相当多的更新。)
EDIT2:也许GROUP BY
可以使用?喜欢的东西:
SELECT `user_id`, `points` FROM `usertable` GROUP BY `points` ORDER BY `points` DESC
该查询的问题的可能性,我没有得到的搜索USER_ID。这将是必要发送第二查询:
SELECT `user_id` FROM `usertable` WHERE `points` = $pointsOfTheUser
一般来说,它比使用mySQL更快地对PHP进行排序。如果你在最后一个查询中使用或不使用'ORDER BY'对查询执行'EXPLAIN',你会明白我的意思。这是数据集变大时要考虑的事情。只是我的2cp。 –
我喜欢'//不会发生'评论;) – sjngm
@sjngm:这对了解最佳排名是否应该是重要的。如果我使用负排名,最高的数字是-1,返回的排名是0.但是,我不知道为什么有人应该使用负点;-) –