1

テーブルに指定された値が含まれていない場合にのみ、mysql の更新を作成したい (プレーヤーに空のスロットがある場合)

私の考え:

update player_items 
set slot=20 
where id=0 
and uid=2 
and (SELECT COUNT(*) 
     FROM player_items 
     WHERE slot=12 and uid=2) = 0;

sqlfiddle のコード

これが mysql の質問の 1 つに過ぎないことを願っています

4

1 に答える 1

1

これを行う 1 つの方法は、anti-join パターンを使用することです。

UPDATE player_items p
  LEFT
  JOIN ( SELECT uid
           FROM player_items
          WHERE slot = 12
            AND uid = 2
          LIMIT 1
       ) q
    ON q.uid = p.uid
   SET p.slot = 20
 WHERE p.id = 0
   AND p.uid = 2
   AND q.uid IS NULL

LEFT JOIN は一致する行を探しますが、一致する行が見つからない場合、MySQL はすべて NULL 値を持つ行を生成します。述語を使用して一致した行を除外できるq.uid IS NULLため、一致しなかった行のみが取得されます。

mysql> UPDATE player_items p
    ->   LEFT
    ->   JOIN ( SELECT uid
    ->            FROM player_items
    ->           WHERE slot = 12
    ->             AND uid = 2
    ->           LIMIT 1
    ->        ) q
    ->     ON q.uid = p.uid
    ->    SET p.slot = 20
    ->  WHERE p.id = 0
    ->    AND p.uid = 2
    ->    AND q.uid IS NULL
    -> ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
于 2013-07-11T19:18:52.700 に答える