我有一個包含用戶和積分的數據庫(實際上它是一個百分比,但這並不重要)。用戶(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.但是,我不知道爲什麼有人應該使用負點;-) –