如何使用mysql和php获取已排序行的位置

如何使用mysql和php获取已排序行的位置,php,mysql,flash,Php,Mysql,Flash,我有一个存储高分的表,以及玩家ID。我希望能够通过球员id提取记录,然后获得排名,或者他们的分数在表中的位置。意思是,基本上我想说“你在第n个”位置,完全基于球员的得分和所有其他得分。例如:如果我在第46位,那么对我来说,位置信息就像你在总分中处于第46位一样。有人能给我举个小例子吗?当存在重复的列组值时,这将提供重复的列组值: SELECT t.playerid, t.highscore, (SELECT COUNT(*) FROM TABLE

我有一个存储高分的表,以及玩家ID。我希望能够通过球员id提取记录,然后获得排名,或者他们的分数在表中的位置。意思是,基本上我想说“你在第n个”位置,完全基于球员的得分和所有其他得分。例如:如果我在第46位,那么对我来说,位置信息就像你在总分中处于第46位一样。有人能给我举个小例子吗?

当存在重复的列组值时,这将提供重复的列组值:

SELECT t.playerid,
       t.highscore,
       (SELECT COUNT(*)
          FROM TABLE x 
         WHERE x.playerid = t.playerid
           AND x.highscore >= t.highscore) AS rank
  FROM TABLE t
 WHERE t.playerid = ?
IE:如果三名选手在第二名的得分相同,他们的排名值都是2

这将给出一个明显的价值-三名球员并列第二,只有一名将排名第二:

SELECT x.playerid,
       x.highscore,
       x.rank
  FROM (SELECT t.playerid,
               t.highscore,
               @rownum := @rownum + 1 AS rank
          FROM TABLE t
          JOIN (SELECT @rownum := 0) r
      ORDER BY t.highscore DESC) x
 WHERE x.playerid = ?
这里有一个例子

您希望在用户登录时存储其ID,如

 $_SESSION['username'] = $usernamefromdb;
 $_SESSION['id'] = $userid;
然后,您希望在yoru网站上的每个页面上打开一个会话,您将根据$_会话['id']获取动态信息

 session_start();
然后根据用户ID查找数据库中的数据行

 $userid = $_SESSION['id'];
 $rank_query = "SELECT * FROM table_name WHERE id='$userid'";
 $rank_result = mysqli_query($cxn, $rank_query) or die("Couldn't execute query.");
 $row = mysqli_fetch_assoc($rank_result)
然后使用PHP,将第n个位置声明为变量。并从数据库中提取行的总数

$rank = $row['rank'];
$all = $numrows = mysqli_num_rows($result);
呼应出球员的排名

echo $rank . "out of" . $all;

有两种方法可以做到这一点:

方法1:

SET @i = 0;

SELECT * FROM 
scores s1 INNER JOIN (SELECT *, @i := @i + 1 AS rank FROM scores ORDER BY score DESC) AS s2 USING (id);
SELECT *, (SELECT COUNT(1) AS num FROM scores WHERE scores.score > s1.score) + 1 AS rank FROM scores AS s1
ORDER BY rank asc
方法2:

SET @i = 0;

SELECT * FROM 
scores s1 INNER JOIN (SELECT *, @i := @i + 1 AS rank FROM scores ORDER BY score DESC) AS s2 USING (id);
SELECT *, (SELECT COUNT(1) AS num FROM scores WHERE scores.score > s1.score) + 1 AS rank FROM scores AS s1
ORDER BY rank asc