如何将上一行的值放在下一行

how to put value of the upper row in the bottom rows

我有一个 table 这样的:

+-----+------------+
| id  |    name    |
|-----|------------|
|  1  |     ali    |
|-----|------------|
|  2  |            |
|-----|------------|
|  3  |            |
|-----|------------|
|  4  |    peter   |
|-----|------------|
|  5  |            |
+-----+------------+

我想把上面一行的值放在下面几行。 (如果底行为空)。像这样的事情:

+-----+------------+
| id  |    name    |
|-----|------------|
|  1  |     ali    |
|-----|------------|
|  2  |     ali    |
|-----|------------|
|  3  |     ali    |
|-----|------------|
|  4  |    peter   |
|-----|------------|
|  5  |    peter   |
+-----+------------+

可以这样做吗?

当然,你可以使用这样的东西:

update t
set name=case 
           when name is null then (select name 
                                   from (select * from t) it 
                                   where it.id<t.id and it.name is not null 
                                   order by id desc
                                   limit 1)
           else name
         end

您可以看到它的实际效果 here,但它的工作原理应该是不言自明的。唯一有趣的是内部 select,这是为了解决 MySql 的荒谬限制,它不会让您从 table 更新 select。

例如:

UPDATE my_table a
  JOIN 
     ( SELECT x.*
            , MAX(y.name) new_name 
         FROM my_table x 
         JOIN my_table y 
           ON y.id <= x.id 
        GROUP 
           BY x.id
     ) b
    ON b.id = a.id SET a.name = b.new_name;

UPDATE my_table a
  JOIN 
     ( SELECT x.*
            , CASE WHEN name IS NULL THEN @name ELSE @name:=name END new_name 
         FROM my_table x
            , (SELECT @name:=NULL) vars 
        ORDER 
           BY id
     ) b
    ON b.id = a.id
   SET a.name = b.new_name;

这个怎么样?

update t
    set name = (case when name is not null
                     then @name := name
                     else @name
                end)
    order by id;

这似乎是使用 MySQL 的最简单方法。