通过从具有相同 id 的最近记录中选择值来更新 MySQL 5.6 表中的缺失值

问题描述 投票:0回答:1

假设我有一张带有日志的表。

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;
mysql self-join mysql-5.6 derived-table
1个回答
0
投票

您可以使用嵌套子查询来选择具有非 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;
© www.soinside.com 2019 - 2024. All rights reserved.