2012-02-28 6 views
0

У меня есть эта петля в PHP, чтобы выбрать все мои оценки из моей игры из таблицы MySQL.High score system from my iphone game

Мой запрос:

$sql = "SELECT * FROM $table WHERE "; 

    switch($type) { 
     case "global": 
      $sql .= "1 "; 
      break; 
     case "device": 
      $sql .= "udid = '$udid' "; 
      break; 
     case "name": 
      $sql .= "name = '$name' "; 
      break; 
    } 

    $sql .= "ORDER BY $sort "; 
    $sql .= "LIMIT $offset,$count "; 

    $result = mysql_query($sql,$conn); 

udid является уникальным идентификатором. И петля:

while ($row = mysql_fetch_object($result)) { 
       echo '<tr> 
         <td> 
         '.$rank.' 
         </td> 
               <td> 
         '.$row->name.' 
         </td> 
         <td> 
         '.$row->score.' 
         </td> 
             <td> 
         '.$row->udid.' 
         </td> 

         </tr>'; 
           $rank++; 
      } 

Мой вопрос прост, поэтому человек может видеть внутри игры, на которой он находится. «Как выбрать ранг от udid, вне цикла».

Возможно, создавая новый запрос, который выбирает ранг из udid или настраивает переменную из цикла?

ответ

1

Один из вариантов - это запись функции, которая вычисляет ранг пользователя на основе всех остальных баллов и возвращает его. Затем, называя его, когда пользователь хочет видеть его звание.

Насколько я знаю, игры MMORPG (например) содержат rank поле в своей БД для каждого игрока , и они используют ежедневное или ежечасно задание для обновления этого ранга. Итак, вместо того, чтобы запускать функцию «вычислять-ранг» каждый раз, когда игрок просто хочет увидеть его ранг, вам просто нужно получить значение поля.

EDIT: код функции (не забудьте добавить rank поле в вашей таблице БД)

Файл:

cronjob_update_rank.php:

require 'config.php'; //Or whatever contains your config and DB connection. 

$rank = 1; //The best player ranked as 1 
$getMembers = mysql_query("SELECT id FROM members ORDER BY `score` DESC"); 
while($mem = mysql_fetch_array($getMembers)) 
{ 
mysql_query("UPDATE members SET rank='$rank' WHERE id='{$mem['id']}'"); 
$rank++; 
} 

Обратите внимание, что это всего лишь образец кода, вам нужно настроить его для ваших нужд.

Используйте панель сервера, чтобы создать ежедневный cronjob в этом файле. (или попросите поддержку вашего хостинг-провайдера).

+0

Как я могу сделать эту функцию? – coderjoe

+0

обновил мой ответ. –

1

Вот как запрос к базе данных для ранга для игрока UDID 1:

SELECT COUNT(*) AS rank 
FROM tablename 
WHERE score > (SELECT score FROM tablename WHERE udid = 1) 

Я предполагаю, что более высокий балл лучше, и вы только хранить наибольшее количество очков для каждого игрока.

С индексом score и udid это должно быть довольно быстро.

Что делает запрос, так это количество пользователей, у которых больше очков, чем выбранный пользователь.

Если низкий балл, тем лучше, просто изменить его к этому:

SELECT COUNT(*) AS rank 
FROM tablename 
WHERE score < (SELECT score FROM tablename WHERE udid = 1) 

которая подсчитывает количество игроков с меньшим счетом.

Читать все о MySQL indexes.

+0

На самом деле, чем ниже оценка, тем лучше. Как я могу изменить это, чтобы он работал? Кроме того, что вы имеете в виду под индексом? – coderjoe

+0

Я обновил свой ответ. –

+0

Итак, как бы выглядел мой стол? Являются ли переменные ранга и оценки или поле в моей таблице? Я получаю ошибки все время! – coderjoe