Mysql обновление, если (некоторые заявления)

Я хочу создать обновление 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 ответ

Одним из способов сделать это является использование шаблона против объединения, например

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
Другие вопросы по тегам