Моя таблица будет содержать оценки и инициалы.
Но таблица не будет заказана.
Я могу получить общее количество строк достаточно легко, и я знаю, что могу получить все из них и заказать By, а затем пропустить их и получить ранг THAT способом …
Но есть ли лучший способ? Может ли это быть сделано с помощью инструкции SQL?
Я не слишком беспокоюсь о производительности, поэтому, если SQL-запрос – это сумасшедшая вещь, тогда Ill просто цикл.
Извините. В таблице есть идентификатор как первичный ключ, строка для проверки уникальной установки приложения, столбец для инициалов и столбец для оценки.
Когда кто-то нажимает GET RANK … Я хочу сказать им, что их счет составляет 100 из 1000 игроков.
SELECT s1.initials, ( SELECT COUNT(*) FROM scores AS s2 WHERE s2.score > s1.score )+1 AS rank FROM scores AS s1
У вас есть первичный ключ для таблицы или вы извлекаете данные по инициалам или вы просто извлекаете все данные и перебираете их, чтобы получить одну запись? Сколько результатов вы пытаетесь получить?
Если вы хотите получить только одну запись, как следует из названия, вы будете запрашивать базу данных с использованием условия WHERE:
SELECT score FROM table WHERE user_id = '1';
См. Этот ответ: https://stackoverflow.com/a/8684441/125816
Короче говоря, вы можете сделать что-то вроде этого:
SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr, (@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank FROM rank, (SELECT @r := 0) dummy1 ORDER BY score DESC;
И это приведет к такому результату:
+------+----+-------+------+ | id | nr | score | rank | +------+----+-------+------+ | 2 | 1 | 23 | 1 | | 4 | 1 | 17 | 2 | | 1 | 0 | 17 | 2 | | 5 | 1 | 10 | 3 | | 3 | 1 | 2 | 4 | +------+----+-------+------+
Обратите внимание, что пользователи с равными оценками имеют равные ранги. 🙂