我正在开发一款2人Android游戏,该游戏利用称为“游戏”的MySQL表来跟踪游戏及其分配的玩家。其结构如下:
我用来连接播放器的逻辑是:
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。任何帮助,将不胜感激!并建议以后如何避免此类问题。 谢谢!
答案 0 :(得分:0)
使用LIMIT
是为了限制查询返回的行数。当您运行此查询
SELECT COUNT(*) FROM games WHERE player1_id is NULL AND player2_id is NOT NULL AND isGameComplete=0 LIMIT 1
它在结果中永远不会超过一行,这是表中匹配的行数。 LIMIT
在这里什么都不做。例如,如果有分组,则该限制可能会影响结果。
您应该在此处与“大于零”进行比较,以使逻辑适用于任何数量的不完整游戏。否则,它只会与只有一个不完整游戏的情况匹配。