MySQL 使用随机值和基于该随机值的条件值更新 2 列
MySQL updating 2 columns with random and conditional value based on that random
我有这样一个 table,日期格式为 YYYY-MM-DD
id | state_id | created_on | closed_on |
1 | 1 | 2020-02-19 | NULL |
2 | 2 | 2020-01-02 | 2020-01-03 |
3 | 1 | 2020-01-05 | NULL |
4 | 4 | 2020-02-07 | 2020-02-08 |
4 | 3 | 2020-02-20 | NULL |
我需要用 2 到 6 之间的随机状态更新 STATE WHERE
- state_id 是 1 或者 state_id 是 3
- created_on过去
我可以这样做(它完美地工作):
UPDATE table SET state_id = FLOOR(2 + rand() * 6)
WHERE created_on < CURRENT_DATE()
AND (state_id=1 OR state_id=3)
我需要在同一更新中另外做的是设置 closed_on:
- NULL 如果 新的随机状态 是 3
CURRENT_DATE()
如果 新的随机状态 不是 3
我考虑过使用SET @newState = FLOOR(2 + rand() * 6)
,但这样所有的记录都会有相同的state_id
是否可以使用不同的值进行更新?
像这样
UPDATE table SET state_id = FLOOR(2 + rand() * 6), closed_on = IF(new_state_id = 3, NULL, CURRENT_DATE())
WHERE created_on < CURRENT_DATE()
AND (state_id=1 OR state_id=3)
您可以将 table 与计算随机数的子查询自连接,这样您就可以在外部查询中重用该值:
update mytable t
inner join (
select id, floor(2 + rand() * 6) rnd
from mytable
where state_id in (1, 3)
and created_on < CURRENT_DATE()
) t1 using(id)
set
t.state_id = t1.rnd,
t.closed_on = if(t1.rnd = 3, null, current_date)
我有这样一个 table,日期格式为 YYYY-MM-DD
id | state_id | created_on | closed_on |
1 | 1 | 2020-02-19 | NULL |
2 | 2 | 2020-01-02 | 2020-01-03 |
3 | 1 | 2020-01-05 | NULL |
4 | 4 | 2020-02-07 | 2020-02-08 |
4 | 3 | 2020-02-20 | NULL |
我需要用 2 到 6 之间的随机状态更新 STATE WHERE
- state_id 是 1 或者 state_id 是 3
- created_on过去
我可以这样做(它完美地工作):
UPDATE table SET state_id = FLOOR(2 + rand() * 6)
WHERE created_on < CURRENT_DATE()
AND (state_id=1 OR state_id=3)
我需要在同一更新中另外做的是设置 closed_on:
- NULL 如果 新的随机状态 是 3
CURRENT_DATE()
如果 新的随机状态 不是 3
我考虑过使用SET @newState = FLOOR(2 + rand() * 6)
,但这样所有的记录都会有相同的state_id
是否可以使用不同的值进行更新?
像这样
UPDATE table SET state_id = FLOOR(2 + rand() * 6), closed_on = IF(new_state_id = 3, NULL, CURRENT_DATE())
WHERE created_on < CURRENT_DATE()
AND (state_id=1 OR state_id=3)
您可以将 table 与计算随机数的子查询自连接,这样您就可以在外部查询中重用该值:
update mytable t
inner join (
select id, floor(2 + rand() * 6) rnd
from mytable
where state_id in (1, 3)
and created_on < CURRENT_DATE()
) t1 using(id)
set
t.state_id = t1.rnd,
t.closed_on = if(t1.rnd = 3, null, current_date)