【问题标题】:Mysql delete records older than 7days while leaving lasr 1 record for each device_idMysql删除超过7天的记录,同时为每个设备ID保留最后1条记录
【发布时间】:2019-07-08 06:17:14
【问题描述】:

我有一张带有 device_id 和日期时间的表,速度如下所示

 id | device_id |      server_time    | speed
 ---+-----------+---------------------+-------
 1  |     3     | 2019-06-24 13:35:37 |   25
 2  |     2     | 2019-06-22 13:35:37 |   35
 3  |     2     | 2019-06-27 15:15:22 |   23
 4  |     3     | 2019-06-24 13:35:37 |   54
 5  |     1     | 2019-06-20 13:35:37 |   55
 6  |     4     | 2019-06-10 13:35:37 |   34
 7  |     3     | 2019-06-24 13:35:37 |   4
 8  |     1     | 2019-06-21 13:35:37 |   25

我想删除超过 7 天的记录,但我需要为每个 device_id 保留至少 1 条记录,即使是超过 7 天的记录。

我怎样才能用 mysql 做到这一点?

【问题讨论】:

  • 你的mysql版本是什么
  • 如果您要求 mysql 解决方案,PHP 标签是否相关?
  • 你如何确定应该保留哪个device_id
  • mysql 版本:10.1.40
  • 每个 device_id 至少需要 1 条记录

标签: php sql datetime mariadb


【解决方案1】:

您可以运行查询以获取来自comment 的请求的最高 ID,并删除时间超过 7 天的所有行,而不是每个组的最高 ID。

由于 MySQL 不能在更新/删除查询中对自己的表使用子查询,因此您可以使用子子查询来获取由 device_id 分组的所有最高 ID。

foo 替换为您的实际表名。

DELETE FROM foo
WHERE server_time < DATE_SUB(NOW(), INTERVAL 7 DAY) 
  AND id NOT IN(SELECT * 
                FROM (SELECT MAX(id) 
                      FROM foo 
                      GROUP BY device_id
                ) AS t)

【讨论】:

    【解决方案2】:

    使用row_number()

    delete from 
    (
      select *, row_number() over(partition by device_id order by server_time desc) as rn
      from tablename where server_Time>=NOW() - INTERVAL 7 DAY
    )A where rn<>1
    

    【讨论】:

      【解决方案3】:

      我会写成join:

      delete t
          from <table> t join
               (select device_id,
                       max(server_time) as max_server_time,
                       max(id) as max_id
                from <table> t2
                group by device_id
               ) t2
               on t.device_id = t2.device_id
          where t.id < t2.max_id and
                t.server_time < t2.max_server_time - interval 7 day;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多