在我目前的项目中,我每天每小时ping一台服务器,每天产生24条记录;随着时间的推移,这是一个很多数据,我希望管理员(在PHP中)能够选择一个日期,并删除该日期之前的所有数据,除了每天一个数据。
E.g。如果选择的日期是2/4/16,它将在2016年2月4日之前删除除日期之外的所有记录。
有问题的数据库表的结构是:
{{1}}
我想知道我需要实现的MySQL语句 - 我已经浏览了一下网页,我可以看到我可能需要创建新表,删除表并替换它,但它似乎是它长时间阻止数据库的响应。这是我很困惑的选择语句 - 我理解如何从所述日期之前选择数据,但我不知道如何1)每天只选择1个数据,2)删除其余数据。
非常感谢你的帮助!
答案 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部分中使用的同一个表。包装额外选择会创建一个隐式临时表,但似乎是最简单,最干净的方法。