如何将上一行的值放在下一行
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 的最简单方法。
我有一个 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 的最简单方法。