2017-09-13 82 views
0

我正在使用MysQL,并且我有一张名为abilities的表,其中每行都是玩家拥有的独特能力。每一行保存的数据:MYSQL项目交易

{ 
uuid (unique id of owner of the ability), 
ability_uuid (unique id of ability itself), 
ability_id (type of ability) 
} 

球员交易与其他玩家的能力,我希望它更新的能力,他们所交易的球员所有者uuid,都在1个查询。 以下是我有:

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 
; 

这工作,并且将交换每一个玩家与其他玩家拥有的能力。问题是让我们说玩家失去了其中一种能力的所有权,交易仍然会处理除了交易之外的所有其他能力。

因此,举例来说,如果PLAYER1交易ability1ability2与player2他们ability3ability4,并且事实证明,PLAYER1不再拥有ability1出于某种原因,它仍然会交易ability2ability3ability4,所以player2得到拧紧。

我该如何解决这个问题并使之成为可能,MySQL会检查他们是否拥有服务器认为他们的能力?

+0

编辑你的问题之前提供的样本数据,而此前,对于什么是成功交易看起来像一个不成功的交易看起来像什么。 –

回答

0

其实,我认为更好的方法是首先从数据库中提取数据,检查他们是否有能力然后更新。因此,这将使它2查询,而不是1.编辑:我真的很喜欢戈登Linoff的反应,也可能会使用该解决方案。

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; 
+0

如果他们拥有的能力数量保持不变,他们是否会通过检查,但他们的能力是不同的。所以如果他们拥有4个能力并与其他人交易1,那么这张支票会通过,因为他们仍然拥有4个正确的? – user3736638

+0

@ user3736638。 。 。这就是为什么有'IN'的列表。你把你想要测试的能力放在那里。确保“2”符合能力数量。 –

+0

啊我看到了,这很有道理,谢谢。 – user3736638