MySQL обновление 2 столбцов случайным и условным значением на основе этого случайного - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть такая таблица с датами в формате ГГГГ-ММ-ДД

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_id равно 1 ИЛИ state_id равно 3
  • create_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)

1 Ответ

2 голосов
/ 20 февраля 2020

Вы можете самостоятельно объединить таблицу с помощью подзапроса, который вычисляет случайное число, поэтому вы можете повторно использовать это значение во внешнем запросе:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...