Обновить MySQL столбец даты и времени с вычтенным значением из другой строки в той же таблице - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь обновить / установить endTime-столбец моя таблица называется раундов , как описано ниже

+-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(15) | NO | | NULL | | | startTime | datetime | NO | | NULL | | | endTime | datetime | NO | | NULL | | +-----------+-------------+------+-----+---------+----------------+

Значения (20+, но ограничено здесь):

enter image description here

Значения для столбцов name и startTime получены из API JSON и переданы в база данных. Но мне нужно установить endTime, чтобы вычислить другие события, которые происходят между этими датами. Это раунды в игре.

Конечное время известно. Это одна (1) минута до времени начала следующего раунда.

Я пробовал это

UPDATE rounds 
SET endTime = date_sub((SELECT startTime FROM new_tbl WHERE DATE(startTime) > NOW() ORDER BY startTime ASC LIMIT 1), INTERVAL 1 MINUTE)

( new_tbl - точная копия таблицы раундов , потому что я заблудился в джунглях соединения)

Что, конечно, только что обновило все endTimes с тем же, хотя и правильным, endTime для апрельского раунда.

1 Ответ

1 голос
/ 29 апреля 2020

Если вы используете MySQL 8.0, вы можете использовать оконные функции для этого:

update rounds r
inner join (
    select r.id, lead(startTime) over(order by startTime) leadStartTime
    from rounds
) r1 on r1.id = r.id
set r.endTime = r1.leadStartTime - interval 1 minute

В более ранних версиях это немного сложнее. Вот подход, который эмулирует lead() с коррелированным подзапросом:

update rounds r
inner join (
    select 
        t.id, 
        (select min(t1.startTime) from rounds t1 where t1.startTime > t.startTime) leadStartTime
    from rounds t
) r1 on r1.id = r.id
set r.endTime = r1.leadStartTime - interval 1 minute
...