JDBC и MySQL: запрос на получения номера в топе

tox1cozZ

aka Agravaine
8,456
598
2,893
1. Нужно получить позицию игрока в таблице по количеству очков.
Нагуглил вот такое решение: Ranking in MySQL results
SQL:
SET @rank=0; SELECT @rank:=@rank+1 AS rank, player_name, value FROM my_table ORDER BY value DESC;
Все норм, вывело всех игроков в нужном порядке и с их позицией в топе(столбец rank).
Но мне нужно получить только одного игрока по его нику. Пробовал вот так:
SQL:
SET @rank=0; SELECT @rank:=@rank+1 AS rank, player_name, value FROM my_table WHERE player_name = Agravaine ORDER BY value DESC;
Выводит нужного игрока, но у него позиция(rank) всегда 1.
В SQL не шарю, прошу помидорами не бросаться)
2. JDBC не хочет выполнять как бы двухстрочные запросы, такие как выше. Добавил в url параметр ?allowMultiQueries=true, эксепшн не кидает больше, но все равно не работает. Будто выполняет только то что до первой точки с запятой, ну и ResultSet говорит мне что это запрос на обновление, а не на выборку, типа данных у меня никаких нет.
 
87
1
12
Переписал запрос, чтоб тебе не париться
SQL:
SELECT player_name, value FROM my_table ORDER BY value DESC LIMIT 1
Например указал LIMIT 5, и получил 5 игроков. Уже на своей Java потихоньку перечисляешь и считаешь кто-где-на каком месте. Типа
Java:
int i = 1;
for(string name : row['player_name']){
Debug("Место " + i + " у игрока " + name);
i++;
}
p.s. по лицу не бейте, писал по памяти, да и для примера.
 
Последнее редактирование:
87
1
12
насчёт того чтобы знать какое место(rank), то либо создавать временную таблицу и записывать туда результат этого запроса
SQL:
SET @rank=0; SELECT @rank:=@rank+1 AS rank, player_name, value FROM my_table ORDER BY value DESC;
либо же обратись вот сюда
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Нагуглил такой запрос, вроде подходит.
Java:
"SELECT id, player_name, value, FIND_IN_SET(value, (SELECT GROUP_CONCAT(value ORDER BY value DESC) FROM " + table.getDatabaseTable() + ")) AS rank FROM " + table.getDatabaseTable() + " WHERE player_name =  ?", toPlayer.getCommandSenderName()
 
87
1
12
Та то понятно, что я могу тупо всю таблицу через SELECT достать и потом в джаве в цикле разобрать.
Нужно конкретно запросом)
SQL:
UPDATE `users`,
    (SELECT (@n := @n + 1) AS POSITION, user_id
     FROM users ORDER BY rating_value DESC) as SRC
SET `users`.rating_position = SRC.POSITION
WHERE `users`.user_id = SRC.user_id;
Попробуй это)
Это заполняет поле rating_position по рейтингу. и уже потом ты можешь через
SQL:
SELECT rating_position FROM table WHERE username='JewishCat'
получить его рейтинг
 
2,505
81
397
Думаю, если погуглить, то можно найти решение и без временной переменной.
SQL:
SET @i = 0;
SELECT *
    FROM (
        SELECT (@i := @i + 1) AS pos, player_name, value
            FROM new_table ORDER BY value DESC
    ) AS src
    WHERE player_name = 'Dahaka'
    LIMIT 1
 
2,505
81
397
Видимо через два отдельных запроса.
Еще можешь попробовать создать функцию, которая все это будет делать.
 
Сверху