单个用户

时间:2015-05-18 18:10:01

标签: php mysql ranking

我使用Daniel Vassallo here的建议来对我的mysql表中的条目进行排名。

该建议并不处理关系,这就是我想要它作为一个新条目的方式并不比我在记分板上具有相同分数的旧条目获得更高的排名,它可以满足我的需求。

我的问题是我希望能够使用这种类型的排名来获得单个用户的排名。所以从这个查询的输出我想定义一个名称,以便脚本只返回该用户的排名,名称和分数。

我尝试了很多不同的方法,因为其中一些方法处理单个用户的结果与最终代码结果中显示的结果不同。

非常感谢你的帮助......灰色过去了!

这是我目前的代码:

目前输出:

排名名称分数

  1. me 1111
  2. me 1111
  3. 你1110

    <?php
    include("common.php");
        $link=dbConnect();
    
    $limit = safe($_POST['limit']);
    
    $query = "SELECT name, score, @curRank := @curRank + 1 AS rank
    FROM $dbName . `scores`, (
    SELECT @curRank := 0
    ) q
    
    ORDER BY score DESC LIMIT $limit";
    
    $result = mysql_query($query);    
    $my_err = mysql_error();
    
    if($result === false || $my_err != '')
    {
        echo "";
    }
    
    $num_results = mysql_num_rows($result);
    
    for($i = 0; $i < $num_results; $i++)
    {
         $row = mysql_fetch_array($result);
         echo $row[rank] . " ". $row['name'] . " - " . $row['score'] . "\n";
    }
    ?>
    

    更新

  4. 澄清关系;原始剧本将永远增加,无论关系如何,这是我想要的,因为我不想要它所以关系排名相同(没有联合的地方)而且恰好如此,剧本将有利于第一个人达到这个分数,这样一个新的玩家不能用相同的分数击败他/她,他们必须击败它。

    我知道这已被弃用了,因为我已经在相似的帖子中看到过,但我只是想在将肉添加到骨骼之前尝试修建骨架。

    正如Spencer7593所提出的那样,到目前为止,我已经尝试了以下代码而没有太多运气。

    <?php
    include("common.php");
    $link=dbConnect();
    
    $limit = safe($_POST['limit']);
    
    
    $query = "SELECT name, score, @curRank := @curRank + 1 AS rank
    FROM $dbName . `scores`, (
    SELECT @curRank := 0
    ) q
    ORDER BY score DESC LIMIT $limit";
    
    $result = mysql_query($query);    
    $my_err = mysql_error();
    
    if($result === false || $my_err != '')
     {
         echo "";
     }
    
    $num_results = mysql_num_rows($result);
    
    while ($row = $result->fetch_assoc()) {
    
     if ( $row['rank'] == 'you' ) 
     {
        // output this row because it's for the specified user
        echo $row['name'];
     } 
    
     else 
    
     {
        continue;
     }
     }
     ?>  
    

1 个答案:

答案 0 :(得分:0)

要从查询结果中提取单个用户的排名,您可以在PHP中运行结果,就像您正在做的那样,但是&#34;跳过&#34;指定用户的行输出。

不需要for ($i=0;i<循环。使用&#34; while fetch&#34;环。 (我不喜欢使用弃用的mysql接口给你任何代码示例;新开发应该使用mysqli或PDO。)

  while ($row = $result->fetch_assoc()) {
     if ( $row['name'] == 'you' ) {
        // output this row because it's for the specified user
        echo $row['rank'];
     } else {
        // skip this row
     }
  }

你对处理&#34; tie&#34;发出了一些声音,但是你不清楚你真正想要的输出是什么。如果您希望&#34; score&#34;具有相同值的行rank具有相同的值,只需在查询中处理它。如果当前行的分数与前一行的分数匹配,则不要增加排名。 e.g。

  SELECT @curRank := IF(s.score=@prev,@curRank,@curRank + 1) AS rank
       , s.name
       , @prev := s.score AS score
    FROM $dbName . `scores` s
   CROSS
    JOIN (SELECT @curRank := 0, @prev := NULL) q
   ORDER BY s.score DESC
   LIMIT $limit

将可能不安全的值包含在SQL文本中会导致SQL注入漏洞;我们假设您确保$dbName$limit的值安全

如果您希望查询过滤掉特定name的行,请将该查询包装在parens中并将其作为内联视图引用,例如

SELECT v.rank
     , v.name
     , v.score
  FROM ( SELECT @curRank := IF(s.score=@prev,@curRank,@curRank + 1) AS rank
              , s.name
              , @prev := s.score AS score
           FROM $dbName . `scores` s
          CROSS
           JOIN (SELECT @curRank := 0, @prev := NULL) q
          ORDER BY s.score DESC
          LIMIT $limit
       ) v
 WHERE v.name = 'you'
 ORDER BY v.rank ASC