【问题标题】:MySQL updating 2 columns with random and conditional value based on that randomMySQL 根据该随机值更新具有随机和条件值的 2 列
【发布时间】:2020-02-20 11:28:07
【问题描述】:

我有这样一张表格,日期格式为 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 WHERE 之间的随机状态更新 STATE

  • 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

  • 如果 新的随机状态为 3,则为 NULL
  • 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)

【问题讨论】:

    标签: mysql sql random sql-update mysql-5.7


    【解决方案1】:

    您可以使用计算随机数的子查询自联接表,因此您可以在外部查询中重复使用该值:

    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)
    

    【讨论】:

    • 是的,我只是想到了这个:)
    • 我想我会这样做!
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2020-09-05
    • 2018-12-17
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多