Я написал веб-сервис для Android-игры с PHP. Запрос используется для расчета рейтинга пользователя:Вычислить ранжирование пользователей на основе двух столбцов
$rank = mysqli_fetch_row(mysqli_query($db, "SELECT FIND_IN_SET(`score`, (SELECT GROUP_CONCAT(`score` ORDER BY `score` DESC) FROM `scores`)) AS `rank` FROM `scores` WHERE `user_id` = '{$user_id}'"));
В чем проблема? Предположим, что user_a
отправьте его оценку (например, 1000) и $rank
равно 1, тогда если user_b
введите тот же результат, что и user_a
, $rank
будет 1 раз. Я не хочу этого, в случае равенства очков, первый пользователь должен иметь более высокий ранг. Поэтому я добавил новый целочисленный столбец для таблицы submit_date
timestamp в таблицу scores
и попытался обработать запрос, и, к сожалению, поскольку я не профессионал в SQL, мои попытки не удались.
Обновление: я не буду хранить ранжирование в базе данных. Структура scores
таблица выглядит следующим образом:
`_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`score` int(11) NOT NULL,
`submit_date` int(11) NOT NULL
user_id
уникален. Если пользователь не представил свой счет раньше, создается новая запись. Иначе его запись будет обновлена (в случае, если новый балл выше старого).
Что мне делать?
возможно добавить заказ на дату представления в несколько порядке со счетом http://stackoverflow.com/questions/2051162/sql-multiple-column-ordering – pmaniora
@pmaniora Спасибо за ваш комментарий. Я пробовал это раньше: GROUP_CONCAT ('score' ORDER BY' score' DESC, 'submit_date') не работал. – ma3x
GROUP_CONCAT не группируется по партитуре? то его сгладить до 1, возможно, попробуйте SELECT 'score'? – pmaniora