mySQL запрос

Программирование, которое не связано с API и Flash.

mySQL запрос

Сообщение XELAD » 18 авг 2013, 14:45

Здравствуйте.

Предисловие:
В своём приложении дошёл наконец до создания ТОПа игроков. С сервера получаю данные путем запроса
  1. SELECT ID, Exp FROM tableName ORDER BY Exp DESC LIMIT 100

Всё это прекрасно работает. Однако захотелось получить от базы большего: точной позиции (другими словами, места) заданного (одного) ID в базе, отсортированной по Exp.

Задача:
В одном mySQL запросе:
1) Отсортировать базу по Exp (изначальная сортировка - по времени добавления записи, что вообще ничего не даёт).
2) Найти переданный (скрипту) ID
3) Вычислить позицию строчки с данным ID

Подробнее:
Прочитал всё касательно синтаксиса SELECT и информационных функций, но то ли не заметил, то ли там действительно нет похожего.
Понимаю, что легче получить список из 100 пользователей способом описанным выше, и (есть в списке) ? индекс : 100+
Но это не то, чего бы хотелось.

Буду благодарен за помощь!
XELAD

 
Автор темы
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: mySQL запрос

Сообщение XELAD » 18 авг 2013, 17:03

Прочитал-перечитал статьи русские и английские. С учётом того, что Exp - не единственное поле, по которому мне бы хотелось сортировать таблицу, то постоянный вариант - через myAdmin - не подходит вовсе. Не нашёл решения кроме как сделать следующее в одном запросе:
1) Создать временную переменную @XXX (дада, в самом mySQL запросе), в которой будет храниться

2)
А дальше mysql_num_rows к полученному результату, что и будет местом (позицией) игрока в общем топе...

Такова задумка, она сразу ломается об производительность, где я заставляю базу вывести (возможно) огромное количество строк. Я написал вывод ID, так как по сути неважно, какое поле выводить, лишь бы строка была (а можно ли вообще не выводить ни одного поля?), а ID обычно Primary.
Конечно, если в базе будут значения с одинаковым кол-вом Exp, игрок будет в конце списка ID с одинаковым Exp, но да не суть.

Проблема не решена, буду благодарен за совет.
XELAD

 
Автор темы
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.

Re: mySQL запрос

Сообщение Serge » 18 авг 2013, 18:00

Вообще не понял проблемы.
  1. SELECT ID, Exp FROM tableName ORDER BY Exp DESC LIMIT 100

Выбирает айди и експ, с нужной сортировкой. На выходе массив вида $list[$i], где 0 <= $i <= 99, $i - целое. $i+1 - и есть позиция в массиве
http://sevenlines.com.ua - разработка и продвижение сайтов
Serge
WEB Team
WEB Team
 
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55
Благодарил (а): 2 раз.
Поблагодарили: 65 раз.

Re: mySQL запрос

Сообщение XELAD » 18 авг 2013, 18:05

Serge
Вы написали то самое
  1. позиция = (есть в списке) ? индекс : 100+


Для тех, кто есть в ТОП-100 всё просто, я рассматриваю ситуацию, когда игрок не оказался в списке ТОПа. И не хочу для таких людей указывать "Ваша позиция 100+", хочется "Ваша позиция 1234567" (по Exp).
XELAD

 
Автор темы
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.

Re: mySQL запрос

Сообщение sasha^ » 18 авг 2013, 18:25

все просто..
  1. SELECT COUNT(*)+1 as position FROM tableName WHERE score>(SELECT score FROM tableName WHERE id=$id)

пояснение: считает сколько записей в бд имеют счет больше чем у нужного юзера и прибавляется 1, т.е. и есть позиция юзера в бд...
P.S. малое потребление памяти и ресурсов как бд, так и php...

За это сообщение автора sasha^ поблагодарил:
XELAD
sasha^

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: mySQL запрос

Сообщение XELAD » 18 авг 2013, 18:45

sasha^
Большое спасибо!
Насколько я понял, результирующий код на php будет таков (знаю, синтаксис не новый):
  1. $result = mysql_query("SELECT COUNT(*)+1 as position FROM tableName WHERE Exp>(SELECT Exp FROM tableName WHERE id=$id)");
  2. print (mysql_result($result, 0, "position"));
XELAD

 
Автор темы
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.

Re: mySQL запрос

Сообщение XELAD » 20 авг 2013, 00:59

sasha^
Ещё раз большое спасибо, ваш код действительно работает, проверил.
P.S. В моём результирующем коде конечно должно быть id='$id'
XELAD

 
Автор темы
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.


Вернуться в Программирование на PHP и других языках (без использования API)



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron