Присвоение индексов строкам в таблице

Есть база данных mySQL, есть таблица с лидербордой. В ней есть поле айди, счёт и позиция. Пользователь с айдишником обновляет свой счёт, база должна пересчитать его позицию. Тут проблем нет: беру из игроков с бОльшим счётом чем у меня игрока с минимальным счётом, к его позиции добавляю единицу и записываю. Но при этом нарушаются позиции игроков с позициями равной и меньше моей. Есть ли способ в один запрос обновить у всех игроков позицию?
Всем этим делом рулит PHP.
  • Вопрос задан
  • 3027 просмотров
Решения вопроса 1
Tyranron
@Tyranron
UPDATE `board`
SET `position`=`position`+1
WHERE `position`>='$myPosition' AND `id`<>'$myID'

Хотя я не вижу смысла делать отдельно поле для позиции. Этим самым Вы только мороки себе добавляете, так как нужно синхронизировать 2 поля, которые по сути означают одно и то же - место игрока в рейтинге. Достаточно `id` и `scores`. При выборке делаете ORDER BY `scores` ASC/DESC и уже в PHP проставляете порядковые номера по ходу разбора результатов запроса. Если нужна позиция по конкретному `id`, то:
SELECT COUNT(`b`.`id`) AS `position`
FROM `board` AS `b` JOIN `board` AS `my`
ON(`b`.`scores`>`my`.`scores` OR (`b`.`scores`=`my`.`scores` AND `b`.`id`<`my`.`id`))
WHERE `my`.`id`='$myID'

...если одним запросом, но лучше 2мя: сначала выбрать кол-во очков для конкретного `id`, потом посчитать позицию исходя из `id` и очков.
Лучше увеличить сложность выборки, чем обновлять пол-таблицы каждый раз.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект