mysql:根据另一列的值将列设置为上一行的值

mysql: set column to value from previous row based on another column's value

尝试执行以下操作:如果当前行的 c1 列等于上一行的 c1 列,则将 c3 列设置为上一行的 c2 列;否则,将 c3 设置为 NULL(或者不将其设置为任何值)。有人能告诉我为什么以下查询导致每一行的 c3 都为 null 吗?

虚拟列只是为了能够设置变量@c1 和@c2,它们应该存储该行的 c1 和 c2 值以用于下一行。顺便说一句,我假设 c3 将首先更新是错误的,即它将获得 @c2 的先前值(在 @c2 被分配给当前 c2 之前)?

UPDATE t SET c3 = IF (c1 = @c1, @c2, NULL), dummy1 = @c1:=c1, dummy2 = @c2:=c2;

我试过了,它似乎工作正常。但是,如果您需要按特定顺序评估行,则需要 ORDER BY

create table t (c1 int, c2 int, c3 int, id int auto_increment primary key);

insert into t (c1, c2, c3) values
 (1, 2, 3),
 (1, 4, 5),
 (2, 6, 7);

select * from t;
+------+------+------+----+
| c1   | c2   | c3   | id |
+------+------+------+----+
|    1 |    2 |    3 |  1 |
|    1 |    4 |    5 |  2 |
|    2 |    6 |    7 |  3 |
+------+------+------+----+

update t set c3=if(c1=@c1,@c2,NULL), c1 = @c1:=c1, c2 = @c2:=c2 order by id;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3  Changed: 3  Warnings: 0

select * from t;
+------+------+------+----+
| c1   | c2   | c3   | id |
+------+------+------+----+
|    1 |    2 | NULL |  1 |
|    1 |    4 |    2 |  2 |
|    2 |    6 | NULL |  3 |
+------+------+------+----+

请注意,我不需要虚拟列。只需设置 c1=c1 和 c2=c2,因为它们是空操作。