1

このようなクエリがあります

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データベースエラー:FROM句で更新するターゲットテーブル'user_plan_details'を指定できません

サブクエリ

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

クエリの問題は何ですか?私を助けてください。

4

3 に答える 3

1

その理由は、テーブルのサブクエリからレコードをフェッチしているテーブルを更新しているためです。MYSQLはこれを許可しません、あなたはその場で一時テーブルを作成することによってデータベースをだます必要があります

あなたは単に::することができます

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

またはあなたがあなたのスタイルでそれをしたいなら::as::

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 
于 2012-12-04T06:49:42.237 に答える
1

サブクエリエラー「サブクエリでテーブルが正しく使用されていません」の最後の項目を参照してください。

updateステートメントでサブクエリを使用できると書かれていますが、updateとsubselectで同じテーブルを使用することはできません。

しかし、代わりにこれを試すことができます

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フィドル。

于 2012-12-04T06:45:57.650 に答える
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 ;
于 2012-12-04T07:03:27.860 に答える