【问题标题】:How to make ranking system in PHP如何在PHP中制作排名系统
【发布时间】:2013-05-19 14:49:24
【问题描述】:

我有问题。 . 就我而言,我获得了冠军。 .要知道,赢家是由最高的价值决定的。 . 示例:

$sql = "SELECT bla bla bla FROM `user` ORDER BY `point` DESC";
$result = mysql_query($sql);
$i=0;
while($row = mysql_fetch_array($result)) {
    $1++;
    echo "rank ".$i." is ".$row['name']." with point ".$row['point'].";
}

它会显示

  • rank 1 是 abc 点 10
  • 排名 2 是 def 与点 9
  • 等级 3 是 ghi 与点 8
  • 等级 4 是 jkl 与点 7
  • 等级 5 是 mno 与点 7
  • 排名 6 是 pqr 与点 3
  • 排名 7 是第 1 点的 stu

问题。 .

  1. 查看结果。 .等级 4 和等级 5 具有相同的点。 .怎么做 他们在同一个位置??
  2. 如何自动检测冠军头衔,比如 1 级是大老板,2 级是老板,7 级是工人??
  3. 如何告诉前任:你在第 6 位??

【问题讨论】:

  • $1++; o_O ....
  • 对于您的第一个问题,提示:如果点与前一点相同,则不要增加 $i
  • @Rikesh:通常当多个玩家得分相同时 - 他们占据相同的位置但位置会增加。比如A和B在第一,C在第三。

标签: php ranking


【解决方案1】:

ad 1. 逐点分组,添加@curRow := \@curRow + 1 AS row_numbe 选择当前行号作为排名位置

ad 2. left join title_dict on row_number = title_dict.id

其中标题字典是带有 title_id 和标题名称字典的表

ad 3. 从您的选择中选择 id = 您的 id

【讨论】:

  • ROW_NUMBER() --- OP 询问的是 mysql,而不是 oracle
  • 我的意思是使用存储当前行号的变量添加到语句 \@curRow := \@curRow + 1 AS row_number 像这样,抱歉这个没有解释任何内容的愚蠢评论。
  • 所以把它放在答案中。 OP 不知道你在说什么
  • 喜欢这个家伙。 . SELECT l.user_id, l.name, l.point, \@curRow := \@curRow + 1 AS rank FROM user l LEFT JOIN level ON rank = level_id JOIN (SELECT \@curRow := 0) r ORDER BY point DESC但这是错误的未知列排名在加入表中如果不加入表级别它的工作谢谢
【解决方案2】:

保存最后一个分数,并确保在增加之前它不等于当前分数。

$sql = "SELECT bla bla bla FROM `user` ORDER BY `point` DESC";
$result = mysql_query($sql);
$i=0;
$lastscore = NULL;
while($row = mysql_fetch_array($result)) {
   if ($lastscore != $row['point']){
   $i++;
   }
   echo "rank ".$i." is ".$row['name']." with point ".$row['point'];
   $lastscore = $row['point'];
}

【讨论】:

    【解决方案3】:
    $sql = "SELECT bla bla bla FROM `user` ORDER BY `point` DESC";
    $result = mysql_query($sql);
    
    if( !$result ){
      echo 'SQL Query Failed';
    }else{
    
      $rank = 0;
      $last_score = false;
      $rows = 0;
    
      while( $row = mysql_fetch_array( $result ) ){
        $rows++;
        if( $last_score!= $row['point'] ){
          $last_score = $row['point'];
          $rank = $rows;
        }
        echo "rank ".$rank." is ".$row['name']." with point ".$row['point'].";
      }
    }
    

    这段代码也会适当调整排名——比如:

    rank 1 is Adam Aarons with point 100
    rank 2 is Barry Blue with point 90
    rank 2 is Betty Boop with point 90
    rank 4 is Charlie Chaplin with point 80
    

    请注意,没有“第三名”,因为“查理·卓别林”实际上是第四高的得分手。

    如果您不想要这种行为,只需将$rank = $rows; 替换为$rank++;

    【讨论】:

      【解决方案4】:

      实际上,对具有相同点数的玩家进行排序的一种非常简单的方法是在“点数”列中添加一个包含上次更新时间戳的“points_last_update”列。然后,您只需将“points_last_update”添加到您的 sql 语句中的 ORDER BY 中。这样,第一个达到积分的玩家排名更高,这是逻辑。

      【讨论】:

      • 如果分数表是仅插入的并且有一个自动递增的主键,那么主键可能以类似于显式时间戳列的方式使用。不过我同意,明确的专栏更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多