2014-04-04 3 views
4

는 내가업데이트

game (PRIMARY INT id, TINYINT offline) 

그 게임에 대한 세부 정보와 두 번째 테이블에 대한 정보가있는 테이블이 있다고 가정 자주 그리고 다양한 프로그램에서. 거기에서 세부 사항의 오프라인 플래그를 설정했습니다. 게임 자체의 오프라인 플래그를 설정할 수있는 프로그래밍 방식의 가능성이 없습니다. (온라인 세부 정보를 찾으면 게임의 오프라인 플래그를 0으로 설정합니다.) 하지만 업데이트 쿼리를 통해 데이터베이스에이 정보를 설정하고 싶습니다. 이 아이디어는 다음과 같습니다 SELECT :

SELECT DISTINCT game.id FROM game 
    LEFT JOIN gamedetail AS gdon 
      ON (gdon.game_id = game.id AND gdon.offline = 0) 
    LEFT JOIN gamedetail AS gdoff 
      ON (gdoff.game_id = game.id AND gdoff.offline = 1) 
WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL; 

이렇게하면 오프라인 게임 영역 만있는 모든 게임을 멋지게 즐길 수 있습니다. 그래서 나는이 같은 UPDATE 문에 대한 입력으로이 걸릴하고 싶습니다 : 이것은 불행하게도 때문에 ERROR 1093 (HY000): Table 'game' is specified twice, both as a target for 'UPDATE' and as a separate source for data의, MySQL의 실패

UPDATE game SET game.offline=1 WHERE game id IN (
    SELECT DISTINCT game.id FROM game 
     LEFT JOIN gamedetail AS gdon 
       ON (gdon.game_id = game.id AND gdon.offline = 0) 
     LEFT JOIN gamedetail AS gdoff 
       ON (gdoff.game_id = game.id AND gdoff.offline = 1) 
    WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL; 

) 

.

제 질문은 내 업데이트 성명을 mysql에서 작동하는 것으로 변경하는 것입니다.

편집 :

UPDATE game SET game.offline=1 WHERE game.id IN (
    SELECT * FROM (
    SELECT DISTINCT game.id FROM game 
     LEFT JOIN gamedetail AS gdon 
       ON (gdon.game_id = game.id AND gdon.offline = 0) 
     LEFT JOIN gamedetail AS gdoff 
       ON (gdoff.game_id = game.id AND gdoff.offline = 1) 
    WHERE gdon.id IS NOT NULL AND gdon.id IS NULL; 
) t 
) 
+0

[[FROM 절에서 업데이트 할 대상 테이블 'NAME]을 (를) 지정할 수 없습니다.] (http://stackoverflow.com/questions/17742214/you-cant-specify-target-table-name-for -update-in-from-clause) –

답변

2

그냥 간단한을 사용하여 하위 쿼리

UPDATE game 
LEFT JOIN gamedetail AS gdon 
       ON (gdon.game_id = game.id AND gdon.offline = 0) 
     LEFT JOIN gamedetail AS gdoff 
       ON (gdoff.game_id = game.id AND gdoff.offline = 1) 
SET game.offline=1 
    WHERE gdoff.id IS NOT NULL AND gdon .id IS NULL; 

가 필요에 가입하지 : 조건

+0

thx, 나는 where 조건을 수정했다. 이것은 실제 테이블을 단순화 한 것이므로 오류입니다. 지금 너의 제안을 시도해. – luksch

8

이 같은 하위 쿼리 내부 쿼리를 감싸 어디 정정 또는 하위 쿼리를 사용하는 경우 업데이트 쿼리에서 where 절에 동일한 테이블을 지정할 수 있으므로 새 별칭을 제공해야합니다. where 조건은이어야합니다. 0

+1

이 쿼리는 OUTER JOIN과 비교할 때 표준 SQL을 사용하고 다른 데이터베이스에서도 작동한다는 장점이 있습니다. – zzzeek