Как получить положение отсортированных строк с помощью MySQL и PHP - PullRequest
4 голосов
/ 16 августа 2010

У меня есть таблица, в которой хранятся рекорды, а также идентификаторы игроков. Я хочу иметь возможность извлечь запись по идентификатору игрока, а затем получить ранг или положение их счета в таблице. Значит, я хочу сказать, что вы находитесь на N-й позиции, основываясь исключительно на оценке игроков против всех остальных. Например: если я на 46-й позиции, то для меня сообщение о позиции будет таким, как будто вы на 46-й позиции из общего количества баллов. Кто-нибудь может показать мне маленький пример?

Ответы [ 3 ]

3 голосов
/ 16 августа 2010

Есть два способа сделать это:

Метод 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);

Метод 2:

SELECT *, (SELECT COUNT(1) AS num FROM scores WHERE scores.score > s1.score) + 1 AS rank FROM scores AS s1
ORDER BY rank asc
0 голосов
/ 16 августа 2010

Вот пример.

Вы хотите сохранить идентификатор пользователя при входе в систему, например ...

 $_SESSION['username'] = $usernamefromdb;
 $_SESSION['id'] = $userid;

И затем вы хотите открывать сеанс на каждомстраница на вашем сайте, где вы будете получать динамическую информацию в зависимости от $ _SESSION ['id']

 session_start();

Затем найдите строку данных в базе данных в соответствии с идентификатором пользователя

 $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;
0 голосов
/ 16 августа 2010

Это обеспечит повторяющиеся значения ранга при наличии дубликатов:

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: если у трех игроков одинаковое количество очков за второе место, все они будут иметь значение ранга два.

Это даст отдельное значение - три игрока, связанные за второе место, только один будет оцениваться как второе:

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 = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...