Хранимая процедура MySQL не вызывает правильный CASE - PullRequest
0 голосов
/ 04 февраля 2019

Я разрабатываю игру для двух игроков на Android, в которой используется таблица MySQL под названием «игры» для отслеживания игр и назначенных им игроков.Его структура выглядит следующим образом:

структура таблицы «игр»

Логика, которую я использую для подключения игроков: 1) Искать неполные игры (т.е. где isGameComplete= 0) и посмотрите, есть ли в любом из них player1, не установленный для него (т. Е. Где player1_id = null и player2_id! = Null).Если найден, назначьте присоединяющегося игрока к этой игре, установив его идентификатор вместо player1_id.
2) Найдите неполные игры (например, где isGameComplete = 0) и посмотрите, есть ли для них установлен player2 (то есть где player2_id = null AND player1_id! = Null).Если найден какой-либо игрок, назначьте присоединяющегося игрока к этой игре, установив его идентификатор вместо player2_id.
3) Если оба вышеуказанных случая потерпели неудачу, сделайте новую запись в таблице игр и установите player1_id = идентификатор присоединяющегося игрока.

Я сделал хранимую процедуру из PhpMyAdmin, которую я вызываю через серверный скрипт, как только игрок запускает игру для выполнения вышеупомянутой логики.

Begin
    Set @gameId = -1;
    Set @player1empty = -1;
    Set @player2empty = -1;

    SET @player1empty = (SELECT COUNT(*) FROM games WHERE player1_id is NULL AND player2_id is NOT NULL AND isGameComplete=0 LIMIT 1);
    SET @player2empty = (SELECT COUNT(*) FROM games WHERE player2_id is NULL AND player1_id is NOT NULL AND isGameComplete=0 LIMIT 1);

    CASE
    WHEN @player1empty=1 THEN
    UPDATE games SET player1_id = userId, id =(@gameId:=id ) WHERE player1_id is NULL AND isGameComplete=0 LIMIT 1;
        Set joinedGame = @gameId;
    WHEN @player2empty=1 THEN
    UPDATE games SET player2_id = userId, id =(@gameId:=id ) WHERE player2_id is NULL AND isGameComplete=0 LIMIT 1;
        Set joinedGame = @gameId;
    ELSE 
    Insert into games (player1_id,gameType_id) Values (userId,8);
    Set joinedGame = last_insert_id();
    end CASE;
END

Однако по некоторым причинамновый игрок всегда добавляется в новую запись игры как Player1, даже если в player2_id в неполной игре есть NULL.Я попытался запустить запрос Count отдельно, и он возвращает значение 1 для нулевых случаев игрока 1 и игрока 2.Любая помощь будет оценена!И посоветуйте, как избежать подобных проблем в будущем.Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

Использование LIMIT ограничивает количество строк , возвращаемых запросом.Когда вы выполняете этот запрос

SELECT COUNT(*) FROM games WHERE player1_id is NULL AND player2_id is NOT NULL AND isGameComplete=0 LIMIT 1

, в результате никогда не будет более одной строки, равной количеству совпадающих строк в таблице.LIMIT здесь ничего не делает.Например, если была группировка, ограничение может повлиять на результаты.

Вы должны сравнить «больше нуля», чтобы логика работала с любым количеством незавершенных игр.В противном случае это будет соответствовать только ситуации, когда есть одна неполная игра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...