Как сделать так, чтобы поле в MySQL автоматически обновлялось в зависимости от другого поля? - PullRequest
2 голосов
/ 02 марта 2012

Я создаю браузерную игру PHP / MySQL Star Wars для развлечения. У меня есть опыт (XP) поле. У меня также есть поле ранга. Я хочу, чтобы - в зависимости от количества опыта в поле опыта, поле ранга также менялось. Итак, если у меня от 0 до 300 очков опыта, поле ранга будет Инициированным джедаем. Если у меня будет от 300 до 700 очков опыта, поле ранга будет падаваном. Если у меня будет от 700 до 1000, рангом будет поле Рыцарь-джедай. Я хочу, чтобы он автоматически обновлялся. Возможно ли это?

Ответы [ 4 ]

4 голосов
/ 02 марта 2012

Я рекомендую другой подход.

Создайте вторую таблицу, где вы управляете рангами, что-то вроде этого:

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`;

Это всего лишь грубый пример того, как это можно решить, может быть, он нуждается в некоторых корректировках.Но с этим подходом у вас будет больше контроля над названиями.Как побочный эффект, вы также избежите дублирования данных в таблицах.

2 голосов
/ 02 марта 2012

Нет, триггер - плохой выбор.

Это было бы что-то вроде

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

0 голосов
/ 02 марта 2012

Попробуйте использовать триггеры .

0 голосов
/ 02 марта 2012

Нет!MySQL не может сделать это для вас.Но вы можете сказать MySQL один раз, и он позаботится об этом оттуда.

Я говорю о триггерах.Вам нужно создать триггер (если вы не хотите обрабатывать его в своем php-коде), что mysql должен делать при изменении опыта

Подробнее о создании триггеров читайте в руководствах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...