2013-09-19 2 views
0

= Каков наилучший способ сделать это? Я забираю 100 записей, заказанных по партитуре, для высокого списка баллов. Мне также нужно отменить рейтинг пользователей и указать на следующую позицию.Mysql fetch результаты и текущий ранг

В настоящее время я делаю это как так, но я не уверен, что это лучший способ сделать это

mysql_query("SELECT * FROM highScores ORDER BY score DESC"); 

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

$rank = mysql_num_rows(mysql_query("SELECT id, score FROM highScores WHERE score>='$userScore'")); 

Это получает меня звание, а затем я сделать еще один запрос для следующей позиции над пользователем и получать этот счет

$next_rank_score = mysql_fetch_assoc(mysql_query("SELECT score FROM highScores ORDER BY score DESC LIMIT " . ($rank-2) . ",1")); 

Должен быть гораздо лучший способ сделать это, но я не могу думать об этом.

ответ

0

Если то, что вы делаете, вам не обязательно менять его. Хорошо получить идеи, хотя, хорошо, что вы спросили.

Вот такой подход, требующий только одного попадания в базу данных. Кроме того, ограничение количества возвращенных записей будет покупать скорость, особенно если у вас есть множество баллов, чтобы выбрать 10 лучших.

<?php 

$query = 'SELECT * FROM highScores ORDER BY score DESC limit 0, 101'; 
$highScores = mysql_query($query); 
$ranks = array(); 
$scores = array(); 
$score_to_nexts = array(); 
$i=1; 
while ($highScore = mysql_fetch_array($highScores) and $i<102): 
    $ranks[$i] = $i; 
    $scores[$i] = $highScore['score']; 
    if ($i !== 1): 
     $score_to_nexts[$i-1] = strval($scores[$i-1] - $scores[$i]) 
    endif; 
    $i++; 
endwhile; 

$i=1; 
while ($i<11): 
    $rank = $ranks[$i]; 
    $scores = $scores[$i]; 
    $score_to_next = $score_to_nexts[$i]; 
    $i++; 
endwhile; 
?> 

PHP рипы через массивы с ослепительной скоростью, так что это, безусловно, будет близка к так быстро, как это может быть сделано. Возможно, существует некоторая логика сжимания циклов, но поскольку ваши массивы должны обрабатывать только 11 членов, я бы с этим справился.

Проблема с процедурой, которую вы имеете, это оценки, которые могут меняться между чтениями БД, поэтому ваши номера не могут быть правильно вставлены. Запустив счеты с одного чтения БД, все будет синхронизироваться.

Что касается времени, которое читает БД, то было, что работа над дополнительными чтениями БД была большой, не-нет, но сейчас, это не имеет значения почти так же. Веб-сервер загрузит части БД в память, делая чтение БД часто так же быстро, как и операции с памятью только с помощью php. Исключение было бы, если вы используете много данных или получаете тонну трафика и должны сохранять ресурсы.

+0

Удивительный собирается переварить это сейчас. Основная причина этого заключается в том, что я делаю слишком много звонков в базу данных, и я пытался это ограничить. Наложение большей нагрузки на сторону php не является проблемой вообще – Dave

+0

Хорошо, я нашел проблему с этим. Если рейтинг пользователей не входит в верхние 11 баллов, то нет возможности получить очки в следующем ранге. Например, я нахожусь на 20-м месте, и я рассматриваю высокие оценки. Я не вижу, сколько очков мне нужно получить, чтобы попасть в 19-е место. – Dave

+0

Спасибо за сообщение о проблеме. Я изменил код, чтобы перечислить 100 лучших баллов. – DanAllen

Смежные вопросы