我正在创建一个PHP/MySQL星球大战浏览器游戏,以获得乐趣。我有一个经验(xp)领域。我还有一个等级字段。我希望它是这样的-根据经验领域的经验值,等级领域也会改变。所以,如果我有0到300 xp,等级字段将是绝地入门。如果我有300到700 xp,等级字段将是Padawan。如果我有700到1000,等级领域将是绝地武士。我希望它能自动更新。这可能吗?
我建议采用不同的方法。
创建第二个表来管理排名,类似于以下内容:
id | xp | rank
---+--------+--------------
1 | 0 | Initiate
2 | 300 | Padawan
3 | 700 | Jedi Knight
然后,您可以在SQL查询中引用xp上需要排名的地方,类似于以下内容:
SELECT P.*, R.*
FROM players P
LEFT JOIN ranks R ON P.`player_xp` <= R.`xp`
GROUP BY P.`player_xp`;
这只是一个如何解决这个问题的粗略例子,也许它需要一些微调。但有了这种方法,你将对标题有更多的控制权。作为副作用,您也可以避免表中有大量重复的数据。
它会有点像
CREATE TRIGGER updateRank AFTER UPDATE ON yourTable...
所以它会在你每次更新你的表时运行,无论你是更新你的播放器的xp还是其他什么。
编写一个存储过程,用它更新玩家的xp,同时检查排名是否仍然正确或需要更新到。
或者,您甚至不需要存储过程。这没有经过测试,但也可以工作:
UPDATE yourTable SET
xp = $theXPthePlayerEarnedWhilePlaying,
rank =
CASE WHEN $theXPthePlayerEarnedWhilePlaying BETWEEN 0 AND 299 THEN 'Jedi Initiate'
WHEN $theXPthePlayerEarnedWhilePlaying BETWEEN 300 AND 699 THEN 'Padawan'
/*...*/
ELSE 'unranked Player'
END
WHERE playerId = $yourPlayer;
编辑:如果你想了解更多,这是一个很好的存储过程教程。不要害怕,没那么多,也不太难弄清楚。http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx
否!MySQL无法为您做到这一点。但你可以告诉MySQL一次,它会从那里开始处理它。
我说的是触发因素。你需要创建一个触发器(除非你想在php代码中处理它)当经验改变时mysql应该做什么
阅读手册中关于创建触发器的信息
尝试使用触发器。