我不是存储过程方面的专家,但我认为如果您创建一个带有参数“player1”和“player2”的存储过程,其中 player1 是排名较高的玩家,这样的事情可能会起作用:
# Get current player ranks
SET @player1rank = (SELECT `Rank` FROM `RankTable` WHERE `Player` = player1);
SET @player2rank = (SELECT `Rank` FROM `RankTable` WHERE `Player` = player2);
# Drop ranks for player 1 down to player 2
UPDATE `RankTable` SET `Rank` = `Rank`+1 WHERE `Rank` >= @player1rank AND `Rank` < @player2rank;
# Now update player2's rank
UPDATE `RankTable` SET `Rank` = @player1rank WHERE `Player` = player2;
作为一个存储过程,这将运行得非常快——如果您的表变大,这是一个额外的优势。
这是我的尝试,它没有使用 PhpMyAdmin(找不到版本)在 MySQL 4.0 中注册,但它可能适用于 MySQL 5+,并希望能让你朝着正确的方向前进......
DELIMITER $$
CREATE PROCEDURE rerank_players (IN player1 VARCHAR (100), IN player2 VARCHAR (100))
BEGIN
DECLARE player1rank, player2rank INT;
SET player1rank = (SELECT Rank FROM RankTable WHERE Player = player1);
SET player2rank = (SELECT Rank FROM RankTable WHERE Player = player2);
UPDATE RankTable SET Rank = Rank+1 WHERE Rank >= player1rank AND Rank < player2rank;
UPDATE RankTable SET Rank = player1rank WHERE Player = player2;
END
$$
您需要将参数声明中 VARCHAR 的长度调整为您的数据长度以及重命名表和字段等...