【问题标题】:MySQL update column based on previous row (same column)MySQL 根据前一行更新列(同一列)
【发布时间】:2016-06-24 04:02:54
【问题描述】:

我有以下数据:

ID | Image
1  |  10
2  |  11
3  |  
4  |
5  |

我想用加一之前的行的值来更新缺失值。

最终的输出应该是:

ID | Image
1  |  10
2  |  11
3  |  12
4  |  13
5  |  14

我在更新期间想过选择,但它不起作用。

UPDATE items AS item1
SET item1.image = (SELECT image 
                   FROM items AS item2 
                   WHERE item2.id < item1.id 
                   ORDER BY item2.id DESC LIMIT 1) + 1

【问题讨论】:

  • 身份证总是没有间隔吗?
  • @sagi ID 列并不重要,因为它是自动递增的。但是,如果您在谈论Image 的列数,是的,它们没有任何差距。

标签: mysql


【解决方案1】:

我有同样的问题,我使用带变量 (@) 的简单更新

update items,(select @n := 10) v set `Image`=@n:=@n+1 order by ID asc;

我希望对这个查询有用:D

【讨论】:

    【解决方案2】:

    使用用户变量尝试此解决方案,完整的演示如下。

    SQL:

    -- data
    create table items(ID int, Image int);
    insert into items values
    (1, 10),(2, NULL),(3, NULL),(4, NULL),(5, NULL);
    SELECT * FROM items;
    
    -- SQL needed
    SET @i = 0;
    UPDATE items
    SET Image = (IF(Image IS NULL OR Image = '',
                    @i:=@i+1,
                    @i:=Image
                    ));
    SELECT * FROM items;
    

    输出:

    mysql> SELECT * FROM items;
    +------+-------+
    | ID   | Image |
    +------+-------+
    |    1 |    10 |
    |    2 |  NULL |
    |    3 |  NULL |
    |    4 |  NULL |
    |    5 |  NULL |
    +------+-------+
    5 rows in set (0.00 sec)
    
    mysql>
    mysql> SET @i = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> UPDATE items
        -> SET Image = (IF(Image IS NULL OR Image = '',
        ->                 @i:=@i+1,
        ->                 @i:=Image
        ->                 ));
    Query OK, 4 rows affected (0.00 sec)
    Rows matched: 5  Changed: 4  Warnings: 0
    
    mysql> SELECT * FROM items;
    +------+-------+
    | ID   | Image |
    +------+-------+
    |    1 |    10 |
    |    2 |    11 |
    |    3 |    12 |
    |    4 |    13 |
    |    5 |    14 |
    +------+-------+
    5 rows in set (0.00 sec)
    

    【讨论】:

    • 我看不到在哪里获取最后一个值并添加一个?
    • @Linesofcode 我修复了它。帖子已更新为完整的演示。如果符合预期,请尝试。
    • 按预期工作。 +1 寻求帮助。
    【解决方案3】:

    鉴于您提供的表格不是示例,我会做一些简单而简单的事情,如下所示:

    Update items Set items.Image=items.id+9 WHERE items.Image is NULL;
    

    天哪,我闻到了即将到来的反对票!

    【讨论】:

    • 是id和image的相关性;)
    【解决方案4】:

    您可以将UPDATEJOIN 一起用于派生表:

    UPDATE Items AS i1
    JOIN (
      SELECT ID, @n := @n + 1 AS Image
      FROM Items
      CROSS JOIN (SELECT @n := (SELECT MAX(Image) FROM Items)) AS v
      WHERE Image IS NULL
      ORDER BY ID
    ) AS i2 ON i1.ID = i2.ID
    SET i1.Image = i2.Image;
    

    派生表使用变量来计算具有NULLs 的记录的Image 值。

    Demo here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      相关资源
      最近更新 更多