我正在使用MysQL,我有一个名为abilities
的表,其中每一行都是玩家拥有的唯一能力。每行包含数据:
{
uuid (unique id of owner of the ability),
ability_uuid (unique id of ability itself),
ability_id (type of ability)
}
玩家与另一个玩家进行交易,我希望它能够更新所有玩家的能力所有者uuid
,一次性查询。
这就是我所拥有的:
UPDATE abilities AS abilities1
INNER JOIN abilities AS abilities2 ON
( abilities1.uuid = 'player1_uuid' AND abilities2.uuid = 'player2_uuid' )
SET
abilities1.uuid = abilities2.uuid,
abilities2.uuid = abilities1.uuid
;
这是有效的,并且会将玩家拥有的所有能力与其他玩家交换。问题在于,假设玩家失去了其中一种能力的所有权,交易仍将处理除交易之外的所有其他能力。
因此,举例来说,如果玩家1为ability1
和ability2
与玩家2交换ability3
和ability4
,则发现玩家1不再拥有{{1}由于某种原因,它仍会为ability1
和ability2
交换ability3
,因此播放器2被搞砸了。
我如何修复此问题并使其成为MySQL检查他们拥有服务器认为他们所做的能力?
答案 0 :(得分:0)
实际上,我认为更好的方法是首先从数据库中提取数据,检查他们是否有能力然后更新。因此,这将使它成为2个查询而不是1.编辑:我非常喜欢Gordon Linoff的回复,并且可能会使用该解决方案。
答案 1 :(得分:0)
如果你有能力列表,你可以计算匹配数,只有JOIN
成功才能成功:
UPDATE abilities a1 INNER JOIN
abilities a2 ON
ON a1.uuid = 'player1_uuid' AND a2.uuid = 'player2_uuid' INNER JOIN
(SELECT a.uuid
FROM abilities a
WHERE a.ability_uuid IN ('ability1', 'ability2')
GROUP BY a.uuid
HAVING COUNT(*) = 2 -- all are there
) u1
ON a1.uuid = u1.uuid JOIN
(SELECT a.uuid
FROM abilities a
WHERE a.ability_uuid IN ('ability3', 'ability4')
GROUP BY a.uuid
HAVING COUNT(*) = 2 -- all are there
) u1
ON a2.uuid = u2.uuid
SET a1.uuid = a2.uuid,
a2.uuid = a1.uuid;