MySQL存储过程未调用正确的CASE

时间:2019-02-04 06:34:13

标签: mysql stored-procedures phpmyadmin

我正在开发一款2人Android游戏,该游戏利用称为“游戏”的MySQL表来跟踪游戏及其分配的玩家。其结构如下:

'games' table structure

我用来连接播放器的逻辑是: 1)查找不完整的游戏(即isGameComplete = 0),并查看其中是否有未为其设置玩家1的游戏(即,其中player1_id = null和player2_id!= null)。如果找到任何玩家,则通过设置其ID代替player1_id来为该游戏分配加入玩家。
2)查找不完整的游戏(即isGameComplete = 0),并查看其中是否设置了player2(即player2_id = null AND player1_id!= null)。如果找到,则通过将其ID设置为player2_id来分配加入该游戏的玩家。
3)如果以上两种情况均失败,则在游戏表中创建新记录,并设置player1_id =加入玩家的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

但是,由于某种原因,即使在不完整的游戏中player2_id中为NULL,也总是将新玩家添加为新玩家记录作为Player1。我试过单独运行Count查询,它确实为播放器1和播放器2的空值返回值1。任何帮助,将不胜感激!并建议以后如何避免此类问题。 谢谢!

1 个答案:

答案 0 :(得分:0)

使用LIMIT是为了限制查询返回的行数。当您运行此查询

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

它在结果中永远不会超过一行,这是表中匹配的行数。 LIMIT在这里什么都不做。例如,如果有分组,则该限制可能会影响结果。

您应该在此处与“大于零”进行比较,以使逻辑适用于任何数量的不完整游戏。否则,它只会与只有一个不完整游戏的情况匹配。