2012-12-04 2 views
1

나는이하위 쿼리를 사용하여 MySQL 업데이트 쿼리의 프로 플럼은 무엇입니까?

UPDATE `user_plan_details` 
SET `plan_expiry_date` = Date_add((SELECT plan_expiry_date 
             FROM `user_plan_details` 
             WHERE user_id = 56 
              AND 
            user_plan_details.is_current_plan = 1) 
            , INTERVAL 30 day) 
WHERE `user_id` = '56' 
     AND user_plan_details.is_current_plan = 1 

같은 쿼리 내가이 쿼리

MySQL Database Error: You can't specify target table 'user_plan_details' for update in FROM clause

서브 쿼리

SELECT DATE_ADD((SELECT plan_expiry_date FROM `user_plan_details` WHERE user_id = 56 AND user_plan_details.is_current_plan = 1), INTERVAL 30 DAY) 

을 실행할 때이 같은 오류 메시지가 얻은 결과를 제공해야

1/11/2013 12:00:00 AM 

내 쿼리에 무슨 문제가 있습니까? 도와주세요.

+1

을 너 – Bohemian

답변

1

마지막 항목 Subquery Errors에서 "하위 쿼리의 테이블을 잘못 사용했습니다."를 참조하십시오.

그것은 당신이 UPDATE 문에서 하위 쿼리를 사용할 수 있지만 업데이트 부속 선택에 같은 테이블을 사용할 수 없습니다 말했다.

하지만 당신은 테스트를 위해이 한 대신

UPDATE `user_plan_details` 
SET `plan_expiry_date` = Date_add(plan_expiry_date, INTERVAL 30 day) 
WHERE `user_id` = '56' 
     AND user_plan_details.is_current_plan = 1 

SQL Fiddle을 시도 할 수 있습니다.

1

이유는 해당 테이블의 하위 쿼리에서 레코드를 가져 오는 테이블을 업데이트하기 때문입니다. MYSQL 습관이 가능, 당신은 즉시 임시 테이블을 생성하여 DB를 속일 필요가

당신은 간단하게 할 수 ::

UPDATE `user_plan_details` 
SET `plan_expiry_date` = Date_add(plan_expiry_date, INTERVAL 30 day) 
WHERE `user_id` = '56' 
     AND user_plan_details.is_current_plan = 1 

또는 당신이 당신의 스타일로 그것을 할 :: 을 같이하려는 경우 : :

UPDATE `user_plan_details` 
SET `plan_expiry_date` = Date_add(
Select temp_itself.plan_expiry_date from 
(SELECT plan_expiry_date 
             FROM `user_plan_details` 
             WHERE user_id = 56 
              AND 
            user_plan_details.is_current_plan = 1) 
            , INTERVAL 30 day) temp_itself 
WHERE `user_id` = '56' 
     AND user_plan_details.is_current_plan = 1 
이 방법으로 할 수
0

: 제대로 코드를 포맷하지 않으면, 내가 도울 않을거야

update user_plan_details as t1, (select DATE_ADD((SELECT plan_expiry_date FROM 
    `user_plan_details` WHERE user_id = 56 AND user_plan_details.is_current_plan = 1), 
    INTERVAL 30 DAY) as t2) as t3 set t1.plan_expiry_date=t3.t2 where t1.`user_id` = 
    '56' AND t1.is_current_plan = 1 ; 
관련 문제