假设我有一张带有日志的表。
status
列的值可能为 NULL,我想通过从日志中复制具有非 NULL settingid
和最接近(小于或等于)status
.的相同
mtime
的值来更新此值
| logid | settingid | status | mtime |
| 1 | 1 | NULL | 2022-10-01 | # NULL -> INACTIVE default
| 2 | 1 | ACTIVE | 2022-10-02 |
| 3 | 1 | NULL | 2022-10-03 | # ACTIVE from 2
| 4 | 1 | NULL | 2022-10-04 | # ACTIVE from 2
| 5 | 1 | INACTIVE | 2022-10-05 |
| 6 | 1 | ACTIVE | 2022-10-06 |
| 7 | 1 | INACTIVE | 2022-10-07 |
| 8 | 1 | NULL | 2022-10-07 | # INACTIVE from 7
| 9 | 1 | NULL | 2022-10-09 | # INACTIVE from 7
| 10 | 2 | ACTIVE | 2022-10-10 |
| 11 | 2 | NULL | 2022-10-11 | # ACTIVE from 10
我有在 MySQL 8 中工作的更新查询,但我怎样才能让它在 MySQL 5.6 中工作?
WITH cte AS (
SELECT
logid,
status,
mtime,
CASE WHEN status IS NULL THEN
IFNULL(
(
SELECT status
FROM logs
WHERE
settingid = t.settingid
AND status IS NOT NULL
AND mtime <= t.mtime
ORDER BY mtime DESC
LIMIT 1
),
'INACTIVE'
) ELSE status END AS new_status
FROM
logs t
ORDER BY mtime
)
UPDATE logs t LEFT JOIN cte USING (logid)
SET t.status = cte.new_status
WHERE t.status IS NULL;
您可以使用嵌套子查询来选择具有非 NULL 状态的最近记录
UPDATE logs t
SET t.status = (
SELECT IFNULL(MAX(l.status), 'INACTIVE')
FROM logs l
WHERE l.settingid = t.settingid
AND l.status IS NOT NULL
AND l.mtime <= t.mtime
)
WHERE t.status IS NULL;