2017-09-13 8 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) 
} 

プレイヤーは他のプレイヤーと能力を取引し、私はそれは、彼らがすべて1つのクエリでは、と取引しているプレイヤーに能力の持ち主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つの所有権を失ったとしましょう、取引はまだ取引されているもの以外のすべての能力を処理します。

ので、例えば、そのability3ability4ためplayer2でplayer1取引ability1ability2あれば、それはplayer1は、もはや何らかの理由ability1を所有していることが判明していない、それはまだability3ability4ためability2を交換しますので、player2を取得しますねじ止め。

私はこれを修正して、MySQLがサーバが彼らが考える能力を所有していることをチェックする方法を教えてください。

+0

編集あなたの質問とは前に、サンプルデータを提供し、後にどのような成功した貿易のための失敗した取引がどのように見えるかのように見える。 –

答えて

0

実際には、能力があるかどうかを確認してデータベースチェックからデータを取得してから更新する方が良い方法だと思います。だからこれは1の代わりに2つのクエリになります。編集:私は本当にゴードン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

関連する問題