我可以使用触发器使用另一行的条件更新 table 中的值吗?
Can I use a trigger to update a value in a table using criteria from another row?
我有一个 table 可以显示两人游戏后玩家的排名。 Table 看起来像:
Player
Rank
Previous_rank
A
954
977
B
1023
1000
C
1005
1015
我想创建第四列,其值在每行输入后根据谁在玩谁进行更新
所以如果玩家 A 接下来要玩玩家 c,我希望显示这些值
Player
Rank
Previous_rank
opponent_rank
A
954
977
1015
B
1023
1000
irrelevant
C
1005
1015
977
我已经尝试了下面的触发器,它不起作用,并且也不允许对我的 tables
进行任何额外的输入
创建触发器opp_rank_update
在插入统计数据之前
每行
更新排名
SET opponent_rank = SELECT (SELECT previous_rank FROM rank WHERE player = new.winner)
WHERE 玩家 = new.loser
此触发器正在引用另一个具有原始数据的 table:
Winner
W_Score
Loser
L_Score
A
21
B
18
B
21
C
15
A
21
C
16
您可以尝试使用以下查询:
WITH cte AS(
SELECT *, 0+`Rank` - `Previous_rank` AS diff
FROM tab
)
SELECT t1.`Player`,
t1.`Rank`,
t1.`Previous_rank`,
COALESCE(t2.`Rank`, 'irrelevant') AS opponent_rank
FROM cte t1
LEFT JOIN cte t2
ON t1.player <> t2.player
AND t1.diff < 0
AND t2.diff < 0
ORDER BY t1.Player
子查询(常用table表达式-cte)提取排名之间的差异,然后我们可以对上一个查询的结果进行自连接,以匹配具有负差异的玩家。
对于三个玩家,这会很好。
试试看 here.
我有一个 table 可以显示两人游戏后玩家的排名。 Table 看起来像:
Player | Rank | Previous_rank |
---|---|---|
A | 954 | 977 |
B | 1023 | 1000 |
C | 1005 | 1015 |
我想创建第四列,其值在每行输入后根据谁在玩谁进行更新
所以如果玩家 A 接下来要玩玩家 c,我希望显示这些值
Player | Rank | Previous_rank | opponent_rank |
---|---|---|---|
A | 954 | 977 | 1015 |
B | 1023 | 1000 | irrelevant |
C | 1005 | 1015 | 977 |
我已经尝试了下面的触发器,它不起作用,并且也不允许对我的 tables
进行任何额外的输入创建触发器opp_rank_update 在插入统计数据之前
每行
更新排名
SET opponent_rank = SELECT (SELECT previous_rank FROM rank WHERE player = new.winner)
WHERE 玩家 = new.loser
此触发器正在引用另一个具有原始数据的 table:
Winner | W_Score | Loser | L_Score |
---|---|---|---|
A | 21 | B | 18 |
B | 21 | C | 15 |
A | 21 | C | 16 |
您可以尝试使用以下查询:
WITH cte AS(
SELECT *, 0+`Rank` - `Previous_rank` AS diff
FROM tab
)
SELECT t1.`Player`,
t1.`Rank`,
t1.`Previous_rank`,
COALESCE(t2.`Rank`, 'irrelevant') AS opponent_rank
FROM cte t1
LEFT JOIN cte t2
ON t1.player <> t2.player
AND t1.diff < 0
AND t2.diff < 0
ORDER BY t1.Player
子查询(常用table表达式-cte)提取排名之间的差异,然后我们可以对上一个查询的结果进行自连接,以匹配具有负差异的玩家。
对于三个玩家,这会很好。
试试看 here.