我首先要说明我对MySQL触发器/函数/ SP等相当新的事实...... 因此,如果有任何关于如何询问此问题的错误,请告诉我,我会尝试获取我错过的任何信息。
aos_matchs (MatchID eventTime联盟initPlayer initAirplane事件targPlayer targAirplane武器hitCount msgID)
aos_players (MatchID Time Era VS Armament Winner redPlayers bluePlayers)
aos_playerslist (姓名ace_factor)
aos_matchs.MatchID = aos_players.MatchID(MatchID指示)
aos_matchs.Initiator = aos_playerslist.Name(由玩家姓名链接)
aos_matchs.targPlayer = aos_playerslist.Name(由玩家姓名链接)
aos_matchs:
MatchID eventTime Coalition initPlayer initAirplane Event targPlayer targAirplane Weapon hitCount msgID
56 00:00:00 red Steve Su-27 birth none none none none 1
56 00:00:00 red Greg Su-27 birth none none none none 2
56 00:00:00 blue Gordon F-15C birth none none none none 3
56 00:00:00 blue George F-15C birth none none none none 4
56 00:00:54 blue George F-15C hit Greg Su-27 GUNS 36 5
56 00:01:09 red Greg Su-27 dead none none none none 6
56 00:01:13 red Steve Su-27 hit Gordon F-15C GUNS 12 7
56 00:01:38 blue Gordon F-15C dead none none none none 8
56 00:03:23 blue George F-15C hit Steve Su-27 GUNS 10 9
56 00:04:59 red Steve Su-27 hit George F-15C GUNS 8 10
56 00:05:08 blue George F-15C dead none none none none 11
74 00:00:00 red John F-15C birth none none none none 1
74 00:00:00 red Adam F-15C birth none none none none 2
74 00:00:00 red Michael F-15C birth none none none none 3
74 00:00:00 red Bob F-15C birth none none none none 4
74 00:00:00 blue Berry Su-27 birth none none none none 5
74 00:00:00 blue Jim F-15C birth none none none none 6
74 00:00:00 blue David Su-27 birth none none none none 7
74 00:00:00 blue Randy F-15C birth none none none none 8
74 00:00:48 red John F-15C hit Jim F-15C GUNS 16 9
74 00:01:13 blue Randy F-15C dead none none none none 10
74 00:01:37 red Adam F-15C hit Jim F-15C GUNS 10 11
74 00:01:46 red John F-15C dead none none none none 12
74 00:02:02 red Bob F-15C dead none none none none 13
74 00:02:09 red Michael F-15C hit David Su-27 GUNS 52 14
74 00:02:19 blue David Su-27 dead none none none none 15
74 00:02:30 red Adam F-15C hit Berry Su-27 F-15C 1 16
74 00:02:30 blue Berry Su-27 hit Adam F-15C Su-27 1 17
74 00:02:30 red Adam F-15C hit Berry Su-27 F-15C 1 18
74 00:02:30 blue Berry Su-27 hit Adam F-15C Su-27 1 19
74 00:02:36 red Adam F-15C dead none none none none 20
74 00:03:38 red Michael F-15C hit Berry Su-27 GUNS 48 21
74 00:03:39 blue Berry Su-27 dead none none none none 22
74 00:03:39 red Michael F-15C hit Berry Su-27 GUNS 10 23
74 00:15:09 blue Jim F-15C hit Michael F-15C GUNS 40 24
74 00:15:18 red Michael F-15C dead none none none none 25
aos_players:
MatchID Time Era VS Armament Winner redPlayers bluePlayers
56 0000-00-00 00:00:00 modern 2vs2 GUNS red Steve/Greg Gordon/George
74 0000-00-00 00:00:00 modern 4vs4 GUNS blue Adam/John/Michael/Bob Berry/Jim/David/Randy
球员
Name ace_factor
Steve 1
John 1
Adam 1
Michael 1
David 1
Bob 1
Randy 1
Gordon 1
George 1
Greg 1
我想用触发器捕获任何插入到Match表中的信息,然后运行查询以从MatchInfo表中获取相关信息并遍历查询结果。 逐行进行后,决定随后对Players表的更新。
我的想法是 -
创建一个触发器,在插入信息后捕获插入操作以匹配表。
在该触发器中,对相对MatchInfo表运行查询,然后遍历查询结果的每一行并相应地更新Players表。
使用可执行上述操作的触发器示例获得任何帮助。
编辑:按照Barmars的要求,我将表格编辑为原始布局,并附上一些原始信息,以便更好地理解。
aos_playerslist正在使用以下触发器进行更新:
DELIMITER $$
USE `mytable`$$
DROP TRIGGER /*!50032 IF EXISTS */ `UpdatePlayersList`$$
CREATE
/*!50017 DEFINER = 'admin'@'%' */
TRIGGER `UpdatePlayersList` BEFORE INSERT ON `aos_matchs`
FOR EACH ROW BEGIN
INSERT IGNORE INTO `aos_playerslist` (`name`,`ace_factor`) VALUES (new.initplayer,1);
END;
$$
DELIMITER ;
接下来我想在aos_matchs表中插入新匹配时更新aos_playerslist表中的ace_factor,当发生这种情况时,我正在尝试通过以下查询结果更新触发器 -
SELECT t1.initPlayer,t1.percentage/t2.full_percentage AS 'kill_percent'
FROM (
SELECT aos_matchs.MatchID,aos_matchs.`initPlayer`,SUM(CASE aos_matchs.Weapon
WHEN 'GUNS' THEN aos_matchs.hitcount
ELSE 70
END) AS 'percentage',dtable.dead
FROM aos_matchs
LEFT JOIN (
SELECT MatchID,initPlayer AS dead
FROM aos_matchs
WHERE `event`='dead') dTable
ON dTable.MatchID=aos_matchs.`MatchID` AND dTable.dead=aos_matchs.targPlayer
WHERE aos_matchs.`Event`='hit'
AND dTable.dead IS NOT NULL
GROUP BY aos_matchs.`MatchID`,aos_matchs.`initPlayer`,dtable.dead) t1
LEFT JOIN (
SELECT aos_matchs.MatchID,SUM(CASE aos_matchs.Weapon
WHEN 'GUNS' THEN aos_matchs.hitcount
ELSE 70
END) AS 'full_percentage',dtable.dead
FROM aos_matchs
LEFT JOIN (
SELECT MatchID,initPlayer AS dead
FROM aos_matchs
WHERE `event`='dead') dTable
ON dTable.MatchID=aos_matchs.`MatchID` AND dTable.dead=aos_matchs.targPlayer
WHERE aos_matchs.`Event`='hit'
AND dTable.dead IS NOT NULL
GROUP BY aos_matchs.`MatchID`,dtable.dead) t2
ON t1.MatchID=t2.MatchID
AND t1.dead=t2.dead
WHERE t1.MatchID = <matchID>
AND t1.dead = <the tested dead player>
然后,通过死亡测试的玩家和杀手的杀戮百分比,它将通过这些规则更新ace_factor列 -
if ace_factor1==ace_factor2 then
{
if player_1 wins
{
new_acefactor1=ace_factor1+(ace_factor1/(ace_factor1+ace_factor2));
new_acefactor2=ace_factor2-(ace_factor1/(ace_factor1+ace_factor2));
}
else if player_2 wins
{
new_acefactor1=ace_factor1-(ace_factor1/(ace_factor1+ace_factor2));
new_acefactor2=ace_factor2+(ace_factor1/(ace_factor1+ace_factor2));
}
}
else if ace_factor1>ace_factor2 then
{
/*Case 2a: the stronger player (player 1) wins the weaker (player 2)
/* then the change in the ace factor of the two opponents is determined by the ace factor of
/*the weaker player
if player_1 wins then
{
new_acefactor1=ace_factor1+(ace_factor2/(ace_factor1+ace_factor2));
/*if the ace factor of player 2 (loser) equals "1" then it remains "1" (no
/*reduction)
if ace_factor2==1 then
new_acefactor2=ace_factor2;
else
/* if ace factor of player 2 is greater than "1" then it is reduced
new_acefactor2=ace_factor2-(ace_factor2/(ace_factor1+ace_factor2));
}
/* Case 2b: the weaker player (player 2) wins the stronger player (player 1)
else
{
/* in that case the new ace factor of the weaker player (winner) is determined
/*(increased) by the value of the ace factor of his (stronger) opponent (loser)
new_acefactor2=ace_factor2+(ace_factor1/(ace_factor1+ace_factor2));
/* in that case the new ace factor of the stronger player (loser) is determined
/*(reduced) by the DIFFERENCE between the two ace factors
new_acefactor1=ace_factor1-((ace_factor1-ace_factor2)/(ace_factor1+ace_factor2));
}
我希望这很清楚,我只是在寻找一个触发器来获取每个死机的查询结果,并允许根据上述规则正确更新ace_factor列。
这是我一直在尝试的触发器,但它不起作用,因为我可能做错了,因为我是新手一起触发:
DELIMITER $$
USE `mytable`$$
CREATE
TRIGGER `UpdateAceFactor` AFTER INSERT ON `aos_players`
FOR EACH ROW BEGIN
CREATE TEMPORARY TABLE mPlayers (pName VARCHAR(255));
SET @cid =0;
SET @mID = new.MatchID;
INSERT INTO mPlayers
SELECT initPlayer
FROM aos_matchs
WHERE MatchID = @mID
AND `event`='dead';
WHILE (SELECT COUNT(*) FROM mPlayers WHERE processed = 0)>0 DO
SELECT Top 1 @cid = id FROM mPlayers WHERE processed = 0;
DECLARE initP VARCHAR(255);
DECLARE initPace INT;
DECLARE cur1 CURSOR FOR (
SELECT t1.initPlayer,t1.percentage/t2.full_percentage AS 'kill_percent'
FROM (
SELECT aos_matchs.MatchID,aos_matchs.`initPlayer`,SUM(CASE aos_matchs.Weapon
WHEN 'GUNS' THEN aos_matchs.hitcount
ELSE 70
END) AS 'percentage',dtable.dead
FROM aos_matchs
LEFT JOIN (
SELECT MatchID,initPlayer AS dead
FROM aos_matchs
WHERE `event`='dead') dTable
ON dTable.MatchID=aos_matchs.`MatchID` AND dTable.dead=aos_matchs.targPlayer
WHERE aos_matchs.`Event`='hit'
AND dTable.dead IS NOT NULL
GROUP BY aos_matchs.`MatchID`,aos_matchs.`initPlayer`,dtable.dead) t1
LEFT JOIN (
SELECT aos_matchs.MatchID,SUM(CASE aos_matchs.Weapon
WHEN 'GUNS' THEN aos_matchs.hitcount
ELSE 70
END) AS 'full_percentage',dtable.dead
FROM aos_matchs
LEFT JOIN (
SELECT MatchID,initPlayer AS dead
FROM aos_matchs
WHERE `event`='dead') dTable
ON dTable.MatchID=aos_matchs.`MatchID` AND dTable.dead=aos_matchs.targPlayer
WHERE aos_matchs.`Event`='hit'
AND dTable.dead IS NOT NULL
GROUP BY aos_matchs.`MatchID`,dtable.dead) t2
ON t1.MatchID=t2.MatchID
AND t1.dead=t2.dead
WHERE t1.MatchID = @mID
AND t1.dead = @cid) kTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
the_loop: LOOP
FETCH cur1 INTO initP,initPace;
IF done THEN
LEAVE the_loop;
END IF;
IF initPace == (SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid) THEN
UPDATE `aos_playerslist`
SET ace_factor = (initPace+(initPace/initPace+(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)));
WHERE `name`=initP;
IF (SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid) > 1 THEN
UPDATE `aos_playerslist`
SET ace_factor = ((SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)-(initPace/initPace+(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)));
WHERE `name`=@cid;
END IF;
END IF;
IF initPace > (SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid) THEN
UPDATE `aos_playerslist`
SET ace_factor = (initPace+(initPace/initPace+(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)));
WHERE `name`=initP;
IF (SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid) > 1 THEN
UPDATE `aos_playerslist`
SET ace_factor = ((SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)-(initPace/initPace+(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)));
WHERE `name`=@cid;
END IF;
END IF;
IF initPace < (SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid) THEN
UPDATE `aos_playerslist`
SET ace_factor = (initPace+((SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)/(initPace+(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid))));
WHERE `name`=initP;
UPDATE `aos_playerslist`
SET ace_factor = ((SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)-((initPace-(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid))/initPace+(SELECT ace_factor FROM `aos_playerslist` WHERE `Name`=@cid)));
WHERE `name`=@cid;
END IF;
END LOOP the_loop;
CLOSE cur1;
UPDATE mPlayers SET processed = 1 WHERE id = @cid
END;
END;
END$$
DELIMITER ;