MYSQL项目交易

时间:2017-09-13 01:49:08

标签: mysql sql

我正在使用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为ability1ability2与玩家2交换ability3ability4,则发现玩家1不再拥有{{1}由于某种原因,它仍会为ability1ability2交换ability3,因此播放器2被搞砸了。

我如何修复此问题并使其成为MySQL检查他们拥有服务器认为他们所做的能力?

2 个答案:

答案 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;