如何根据其他字段使MySQL中的字段自动更新?

时间:2012-03-02 10:25:41

标签: php mysql field

我正在创建一个PHP / MySQL星球大战浏览器游戏以获得乐趣。我有一个经验(xp)领域。我也有一个等级字段。我希望它 - 根据体验字段中的XP数量,排名字段也会改变。所以,如果我有0到300 xp,那么rank字段将是Jedi Initiate。如果我有300到700 xp,那么排名字段将是Padawan。如果我有700到1000,那么等级字段将是Jedi Knight。我希望它能自动更新。这可能吗?

4 个答案:

答案 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