排名基于连续的最高数字

时间:2012-08-04 18:39:21

标签: php mysql function rank

我有一个名为“member_points”的表,其设置如下:

|----|-------|----------|------------------------|
| id |  uid  |  points  |  last_loggedin         |
|----|-------|----------|------------------------|
| 1  |  1    |  5075    |  2012-08-02 02:04:00   |
|----|-------|----------|------------------------|
| 2  |  2    |  2026    |  2012-08-04 02:15:02   |
|----|-------|----------|------------------------|

我有一个功能如下。我希望函数能够根据“点”行中的数字来回显或返回“排名#1”或“排名#2”等级。

function getTopRanks($id) {  
   $sql = "SELECT MAX(points) AS toppoints FROM member_points";
   $r = mysql_query($sql);
   if ( $r !== false && mysql_num_rows($r) > 0 ) {
      while ( $a = mysql_fetch_assoc($r) ) {
          $points = stripslashes($a['toppoints']);
          return ''.$points.'';  
      }
   }
}

有人可以帮助我实现这个目标吗?

3 个答案:

答案 0 :(得分:3)

在你的mysql查询中使用ORDER BY(http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html)

所以你的查询将成为

SELECT points FROM member_points ORDER BY points DESC

这将根据点数对查询结果进行排序。 (DESC将使它们下降,ASC将使结果上升)。

答案 1 :(得分:3)

我认为您将根据积分对用户进行排名。 对于此类问题,我建议您先按 DESC 顺序对用户进行排名。然后拾取欲望值形成行。

function getTopRanks($id) {

   $sql = "SELECT uid FROM member_points ORDER BY points DESC ";
   $r = mysql_query($sql);
   if ( $r !== false && mysql_num_rows($r) > 0 ) {
      while ( $a = mysql_fetch_assoc($r) ) {
         $points = stripslashes($a['toppoints']);

           return ''.$points.'';

     }
   }

 }

这将解决您的问题。:)

根据您的要求更新

function getTopRanksUser($id) {
$userPos ="Ranked position is:";
  $count = 0;
  $sql = "SELECT uid FROM member_points ORDER BY points DESC ";
  $r = mysql_query($sql);
  if ( $r !== false && mysql_num_rows($r) > 0 ) {
    while ( $a = mysql_fetch_assoc($r) ) {
       $count = $count+1;
       $userPosCount = $userPos+$count;

       return $userPosCount;

  }
 }

}

应该返回userPos + count。因为count会增加表中的行数,而字符串排名位置始终保持不变。 这将给出结果。您可以根据您的要求更改返回字符串。 :) 感谢。

答案 2 :(得分:0)

这是我用于排名的内容......此代码还会正确考虑关系和显示。只需将“username”和“points”更改为数据库中相应的列名,并设置db connection vars:$ hostName $ databaseNanme $ username和$ password for your connection。

希望这有帮助!

    $sql1 = "SET @rnk=0; SET @rank=0; SET @scount=0;";
    $sql2 = "SELECT username, points, rank FROM
    (
        SELECT AA.*,BB.username, points
        (@rnk:=@rnk+1) rnk,
        (@rank:=IF(@scount=points,@rank,@rnk)) rank,
        (@scount:=points) newscount
        FROM
        (
            SELECT * FROM
            (SELECT COUNT(1) scorecount,points
            FROM users GROUP BY points
        ) AAA
        ORDER BY points DESC
    ) AA LEFT JOIN users BB USING (points)) A;";

try {
    $conn = new PDO('mysql:host='.$hostName.';dbname='.$databaseName, $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->query($sql1);
    $data = $conn->query($sql2);

    $standings = $data->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    error_log( 'ERROR: ' . $e->getMessage() );
}

的print_r($排名);