【问题标题】:Updating each row separately分别更新每一行
【发布时间】:2011-06-23 14:39:34
【问题描述】:

我正在尝试更新我的数据库中的一些行。

我有一张如下表:

id | subid | creation_date

1  | 1/1   | 2011-06-23

1  | 1/2   | 0000-00-00

2  | 2/1   | 2011-06-20

2  | 2/2   | 0000-00-00

我想要的是将 creation_date 设置为“0000-00-00”的条目更新为具有真实日期的条目的 creation_date。

请求后的结果是:

id | subid | creation_date

1  | 1/1   | 2011-06-23

1  | 1/2   | 2011-06-23

2  | 2/1   | 2011-06-20

2  | 2/2   | 2011-06-20

那里有人可以帮助我吗?一个请求就可以做到这一点。

谢谢 ;)

B.

【问题讨论】:

    标签: mysql foreach row


    【解决方案1】:

    解决无法在您正在更新的子查询中包含表的其他答案的问题。让我们在临时表上创建并使用它......

    CREATE TEMPORARY TABLE foo SELECT id, MAX(creation_date) FROM yo_table GROUP BY id;
    UPDATE yo_table SET creation_date = ( SELECT foo.creation_date FROM foo WHERE foo.id = yo_table.id ) 
    WHERE creation_date = '0000-00-00';
    

    【讨论】:

    • 在表创建中的 MAX(creation_date) 之后添加“as mcd”并通过 foo.mcb 修改 foo.creation_date 效果很好,谢谢 ;)
    【解决方案2】:
    update yo_table outter
    set creation_date = 
        (select min(creation date) from yo_table iner where iner.id = outter.id)
    where creation_date = '0000-00-00' --note that you'll have to edit this according to the data type of your creation_date column
    

    编辑:带温度。表

    create table yo_table_tmp as select * from yo_table;
    
        update yo_table outter
        set creation_date = 
            (select min(creation date) from yo_table_tmp iner where iner.id = outter.id)
        where creation_date = '0000-00-00' --note that you'll have to edit this according to the data type of your creation_date column
    ;
    
    drop table yo_table_tmp;
    

    【讨论】:

    • @Gidon 为什么最小值或最大值很重要?根据发布的信息 OP,任何一个都可以工作。
    • 嗯,这个查询似乎有一个错误:“您不能在 FROM 子句中指定目标表 'outter' 进行更新”
    • @LostInSql,你说得对,我忘记了 1093。你还需要一个临时表,请参阅我的编辑。
    【解决方案3】:
    update table_a as t1, table_a as t2
    set t1.creation_date=t2.creation_date
    where t1.id=t2.id and (t1.creation_date=0 and t2.creation_date>0);
    

    【讨论】:

      【解决方案4】:

      我认为这应该适合你:

      UPDATE `tableA` `ta`
      INNER JOIN (
          SELECT `id`, `creation_date`
          FROM `tableA`
          WHERE `creation_date` > '0000-00-00'
          GROUP BY id
      ) `tb` ON `ta`.`id` = `tb`.`id`
      SET `ta`.`creation_date` = `tb`.`creation_date`
      WHERE `ta`.`creation_date` = '0000-00-00';
      

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        创建一个临时表。

        为简单起见,我修改了您的 subid,您可以随时将它们组合到查询结果中。

        mysql>更新表1设置creation_date =(选择x.creation_date 来自 (SELECT * from table1 WHERE subid=1) AS X WHERE x.id =table1.id) WHERE subid=2; 查询正常,2 行受影响(0.00 秒) 匹配行:2 更改:2 警告:0 mysql> 从表 1 中选择 *; +----+-------+----------------+ |编号 |子ID |创建日期 | +----+-------+----------------+ | 1 | 1 | 2011-06-23 | | 1 | 2 | 2011-06-23 | | 2 | 1 | 2011-06-20 | | 2 | 2 | 2011-06-20 | +----+-------+----------------+ 4 行一组(0.00 秒)

        【讨论】:

          猜你喜欢
          • 2022-12-05
          • 2022-12-20
          • 1970-01-01
          • 2017-07-22
          • 2017-02-12
          • 1970-01-01
          • 2020-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多