我正在创建一个PHP / MySQL星球大战浏览器游戏以获得乐趣。我有一个经验(xp)领域。我也有一个等级字段。我希望它 - 根据体验字段中的XP数量,排名字段也会改变。所以,如果我有0到300 xp,那么rank字段将是Jedi Initiate。如果我有300到700 xp,那么排名字段将是Padawan。如果我有700到1000,那么等级字段将是Jedi Knight。我希望它能自动更新。这可能吗?
答案 0 :(得分:4)
我建议采用不同的方法。
创建第二个表来管理排名,如下所示:
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`;
这只是如何解决这个问题的一个粗略的例子,也许它需要一些微调。但是通过这种方法,您可以更好地控制标题。作为副作用,您也可以避免在表格中存在大量重复数据。
答案 1 :(得分:2)
不,触发器是一个糟糕的选择。
这就像是
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
答案 2 :(得分:0)
没有! MySQL无法为你做到这一点。但你可以告诉MySQL一次,并从那里开始处理它。
我在谈论触发器。您需要创建一个触发器(除非您想在PHP代码中处理它),当体验发生变化时,mysql应该做什么
了解如何在manuals
中创建触发器答案 3 :(得分:0)
尝试使用triggers。