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,因为它们是空操作。
尝试执行以下操作:如果当前行的 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,因为它们是空操作。