2

これは私のテーブルです:部屋と呼ばれます

+---------+---------+-----------+-------------+-------------+-------------+---------+
| room_id | room_no | room_stat | room_name   | player_a_id | player_b_id | turn_of |
+---------+---------+-----------+-------------+-------------+-------------+---------+
|       1 |       1 |         0 | blah        |           0 |           0 |       0 |
|       2 |       5 |         0 | second room |           0 |           0 |       0 |
|       3 |       3 |         0 | 3rd room    |           0 |           0 |       0 |
|       4 |       4 |         0 | 4th room    |           0 |           0 |       0 |
+---------+---------+-----------+-------------+-------------+-------------+---------+

$player_id //contains the id of the player who wants to join

#部屋のテーブル:

  1. player_a_id !null および player_b_id !null の場合は何も更新しません。もしも
  2. player_a_id = null および player_b_id !null その後、ルームセットを更新します
  3. player_a_id = $player_id; player_b_id = null かつ player_a_id !null の場合、ルーム セット player_b_id = $player_id を更新します。

私の現在のクエリ(JWに感謝)(編集しようとしましたが、失敗しました)。

     UPDATE  room
             SET     player_a_id = IF(player_a_id IS NULL OR player_a_id  = 0 AND player_b_id != :chara_id, :chara_id, player_a_id),
                     player_b_id = IF(player_a_id != :chara_id AND player_b_id IS NOT NULL, :chara_id, player_b_id)
             WHERE   room_id  = :room_id

これは良いことですが、両方が空または = 0 の場合は 2 つの列を更新します。更新したいのは1だけです。

編集:

ここにサンプル結果があります: player_id 1 が room_id 4 に参加した後:

+---------+---------+-----------+-------------+-------------+-------------+---------+
| room_id | room_no | room_stat | room_name   | player_a_id | player_b_id | turn_of |
+---------+---------+-----------+-------------+-------------+-------------+---------+
|       1 |       1 |         0 | blah        |           0 |           0 |       0 |
|       2 |       5 |         0 | second room |           0 |           0 |       0 |
|       3 |       3 |         0 | 3rd room    |           0 |           0 |       0 |
|       4 |       4 |         0 | 4th room    |           1 |           1 |       0 |
+---------+---------+-----------+-------------+-------------+-------------+---------+

両方の列がnullであるため、両方の列を更新します。1つの列のみを更新したいです。

4

1 に答える 1

2

ロジックを見直して、player_a_id を $player_id IF player_a_id = 0 に更新し、player_b_id が 0 でないことを確認します。

そして、player_b_id = 0 で、player_a_id が 0 でない場合、player_b_idを $player_id に更新します。

編集-- 両方とも 0 の場合は、player_a_id も更新します。

UPDATE  room
SET     player_a_id = IF(player_a_id=0, :player_id, player_a_id),
    player_b_id = IF(player_a_id!=0 AND player_b_id=0, :player_id, player_b_id)
WHERE   room_id  = :room_id
于 2013-05-10T01:25:57.347 に答える