2013-07-11 2 views
1

나는 테이블에 지정된 값을 포함하지 않는 경우에만 (플레이어가 빈 슬롯이있는 경우) 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; 

code in sqlfiddle

이것은 하나의 mysql 질문이 될 수 있기를 바랍니다.

답변

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 (왼쪽)이 일치하는 행을 찾습니다 가입하지만,하는 행이 없을 경우 다음 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 
+0

spencer7593이되지 작동 :(내가 MySQL의에서 오류가 발생했습니다 및 SQL 바이올린이 (스키마 생성 실패 : 당신은 당신의 SQL 구문에 오류가, 오른쪽 구문 MySQL 서버 버전에 해당하는 설명서를 확인을 'UPDATE player_items'근처에서 사용) – user2573981

+0

두 번째 옵션도 작동하지 않습니다. ( – user2573981

+0

SET 절이 잘못된 위치에 있고, WHERE 절 앞에 속합니다. 쿼리를 수정했는데 나에게 맞는 것 같습니다. – spencer7593