MySQL:每个日期选择一个数据

时间:2016-05-03 10:45:28

标签: php mysql

在我目前的项目中,我每天每小时ping一台服务器,每天产生24条记录;随着时间的推移,这是一个很多数据,我希望管理员(在PHP中)能够选择一个日期,并删除该日期之前的所有数据,除了每天一个数据。

E.g。如果选择的日期是2/4/16,它将在2016年2月4日之前删除除日期之外的所有记录。

有问题的数据库表的结构是:

{{1}}

我想知道我需要实现的MySQL语句 - 我已经浏览了一下网页,我可以看到我可能需要创建新表,删除表并替换它,但它似乎是它长时间阻止数据库的响应。这是我很困惑的选择语句 - 我理解如何从所述日期之前选择数据,但我不知道如何1)每天只选择1个数据,2)删除其余数据。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您应该能够使用以下查询实现此目的。

SET @date_param = '2016-04-02';

DELETE FROM server_status WHERE time_checked < @date_param AND id NOT IN (
    SELECT id FROM (
        SELECT MIN(id) AS id
        FROM server_status
        WHERE time_checked < @date_param
        GROUP BY DATE(time_checked) 
    ) AS ids_to_keep
)

显然,如果愿意,你可以用php / bound替换sql变量/参数。

子查询包含在额外选择中的原因是因为在MySQL中,您无法修改在SELECT部分​​中使用的同一个表。包装额外选择会创建一个隐式临时表,但似乎是最简单,最干净的方法。