Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рейтинг и позиция в рейтинге 
V
    Опции темы
neoks
Дата 23.11.2013, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Всем доброго суток, возникла вот такая вот задачка.
Есть таблица пользователей и нужно показать десятку пользователей в том числе и меня самого, думаю всем знаком вам рейтинг как это делается в играх)

Вывести по рейтингу не проблема, но так и не могу найти ответа как узнать позицию в рейтинге и вывести результат моей позиции.

Как вариант сделать так
1. Найти свою запись по id и узнать свой рейтинг
2. Подсчитать строки где рейтинг больше моего, таким образом я узнаю свою позицию
3. Выбрать еще 9 строк где рейтинг ниже моего.

Получится 3 запроса, можно ли как-то разумно это сделать ?
PM MAIL   Вверх
ksnk
Дата 24.11.2013, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Более разумного варианта, чем 4 запроса, я пока не вижу. Можно попытаться объединять запросы, но смысла в этом нет.
узнать свой рейтинг по ID  можно было бы так
Код

SELECT COUNT(*) FROM players WHERE rank > (SELECT rank FROM players WHERE id = ?)

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

вывести по X=3 записей "перед игроком" и "после" можно так
Код

SELECT * FROM players WHERE rank < ? limit 3  
union all
SELECT * FROM players WHERE rank >= ? 
order by rank limit 7

7=3*2+1

Хотя выводить список в таком виде не особенно удобно, особенно в конце-начале рейтингового списка и при одинаковых значениях ранга. Проще и удобнее без всякого юнита выполнить пару запросов на меньше и больше.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 24.11.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk Спасибо, так и буду делать, 3 так 3) 
PM MAIL   Вверх
ksnk
Дата 24.11.2013, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



А какая задача решается-то? Зачем выводить игроков "ниже" по рейтингу и не выводит тех, кто "сверху"?

Впрочем, насчет 4-х запросов, возможно я не прав.
Получить информацию и рейтинг одним запросом можно. Например так 
Код

SELECT x.*,(select COUNT(id) FROM players WHERE skill >=x.skill) as Rank from players as x where id=?

Получается сразу правильный номер, с 1-цы, а не с 0-я как в моем предыдущем запросе. И, на первый взгляд, не особенно неоптимальный. Тестировать нужно...

Вывести по 3 сверху-снизу "рядомрасположенных" игроков, вокруг игрока с рангом 4 со скилом 236, тоже можно "одним" запросом.
Код

SELECT @rank := @rank + 1 As Rank,x.* FROM 
   (select * from players  where skill <236 order by skill DESC limit 3) as x, (SELECT @rank := 4) as rnk
union
SELECT @rankx := @rankx - 1 As Rank,x.* FROM 
   (select * from players  where skill >=236 order by skill limit 4) as x, (SELECT @rankx := 4+1) rnk 
order by Rank


Выводится сразу с местом.



Это сообщение отредактировал(а) ksnk - 24.11.2013, 14:06


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 24.11.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk как всегда выручил smile есть маленький косяк, у меня в таблице всего две записи, получилось так что он вывел позицию 3 и 4, пробовал исправить, подставлял @rankx вместо 4+1 чет не получилось, выводит NULL (
PM MAIL   Вверх
ksnk
Дата 24.11.2013, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Это как это? 
Сначала считаем свое положение и ранг о своему ID. Потом подставляем свое место и ранг в запрос.

Для 2-х записей не может получится 4-е место. Только первое и второе. 

 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 25.11.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(ksnk @  24.11.2013,  12:04 Найти цитируемый пост)
игроков, вокруг игрока с рангом 4 со скилом 236

Не совсем понял что за скилл и ранг, я сортирую по очкам, полный запрос выглядит так

Код

$sql = '
            SELECT @rank := @rank + 1 As num_row,x.* FROM 
               (select * from users  where score <'.$user['score'].' order by score DESC limit 3) as x, (SELECT @rank := 4) as rnk
            union
            SELECT @rankx := @rankx - 1 As num_row,x.* FROM 
               (select * from users  where score >='.$user['score'].' order by score limit 4) as x, (SELECT @rankx := 4+1) rnk 
            order by num_row
        ';


В итоге я на четвертой позиции вместо второй)
PM MAIL   Вверх
ksnk
Дата 25.11.2013, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



@rank := 4 - вот здесь устанавливается ранг (позиция) игрока со score == $user['score'] 
Чтобы узнать свою "позицию", нужно выполнить 
Код

'select COUNT(*) FROM users  WHERE score >= '.$user['score'] 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 26.11.2013, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk Спасибо, все работает) я просто сначала не понял что значит 4)) работает отлично все, еще раз спасибо, выручил как всегда smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.