2015-12-13 2 views
1

Я написал веб-сервис для 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 уникален. Если пользователь не представил свой счет раньше, создается новая запись. Иначе его запись будет обновлена ​​(в случае, если новый балл выше старого).

Что мне делать?

+0

возможно добавить заказ на дату представления в несколько порядке со счетом http://stackoverflow.com/questions/2051162/sql-multiple-column-ordering – pmaniora

+0

@pmaniora Спасибо за ваш комментарий. Я пробовал это раньше: GROUP_CONCAT ('score' ORDER BY' score' DESC, 'submit_date') не работал. – ma3x

+0

GROUP_CONCAT не группируется по партитуре? то его сгладить до 1, возможно, попробуйте SELECT 'score'? – pmaniora

ответ

1
If two user with same score and do display old user at top. 
    you can add on update date ie when the score is update the current date time will be inserted on that field. 
    then when you invoke record from the data base retrieve according to rank and update date 
    like: 
    SELECT * FROM test ORDER BY rank DESC, update_date ASC 

from this you can get two field can order at a time 

table for above result

Смежные вопросы