mySQL запрос

Программирование, которое не связано с API.
Ответить
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

mySQL запрос

Сообщение XELAD »

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

Предисловие:
В своём приложении дошёл наконец до создания ТОПа игроков. С сервера получаю данные путем запроса

Код: Выделить всё

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

Re: mySQL запрос

Сообщение XELAD »

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

Код: Выделить всё

SELECT Exp FROM tableName WHERE ID=$id
2)

Код: Выделить всё

SELECT ID FROM tableName WHERE Exp>=@XXX
А дальше mysql_num_rows к полученному результату, что и будет местом (позицией) игрока в общем топе...

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

Проблема не решена, буду благодарен за совет.
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: mySQL запрос

Сообщение Serge »

Вообще не понял проблемы.

Код: Выделить всё

SELECT ID, Exp FROM tableName ORDER BY Exp DESC LIMIT 100
Выбирает айди и експ, с нужной сортировкой. На выходе массив вида $list[$i], где 0 <= $i <= 99, $i - целое. $i+1 - и есть позиция в массиве
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: mySQL запрос

Сообщение XELAD »

Serge
Вы написали то самое

Код: Выделить всё

позиция = (есть в списке) ? индекс : 100+
Для тех, кто есть в ТОП-100 всё просто, я рассматриваю ситуацию, когда игрок не оказался в списке ТОПа. И не хочу для таких людей указывать "Ваша позиция 100+", хочется "Ваша позиция 1234567" (по Exp).
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: mySQL запрос

Сообщение sasha^ »

все просто..

Код: Выделить всё

SELECT COUNT(*)+1 as position FROM tableName WHERE score>(SELECT score FROM tableName WHERE id=$id)
пояснение: считает сколько записей в бд имеют счет больше чем у нужного юзера и прибавляется 1, т.е. и есть позиция юзера в бд...
P.S. малое потребление памяти и ресурсов как бд, так и php...
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: mySQL запрос

Сообщение XELAD »

sasha^
Большое спасибо!
Насколько я понял, результирующий код на php будет таков (знаю, синтаксис не новый):

Код: Выделить всё

$result = mysql_query("SELECT COUNT(*)+1 as position FROM tableName WHERE Exp>(SELECT Exp FROM tableName WHERE id=$id)");print (mysql_result($result, 0, "position"));
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: mySQL запрос

Сообщение XELAD »

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