【问题标题】:Whats the proplem with Mysql update query with subquery?带有子查询的Mysql更新查询有什么问题?
【发布时间】:2012-11-21 17:58:50
【问题描述】:

我有这样的查询

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

我的查询有什么问题?请帮帮我。

【问题讨论】:

  • 如果你的代码格式不正确,我不会帮你

标签: mysql sql


【解决方案1】:

查看Subquery Errors“子查询中不正确使用的表”的最后一项。

它说你可以在更新语句中使用子查询,但你不能在更新子选择中使用相同的表。

但是你可以试试这个

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 用于测试。

【讨论】:

    【解决方案2】:

    原因是您正在更新一个表,您从该表的子查询中获取其记录。 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
    

    或者如果你想以你的风格去做:: 作为::

    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 
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多