MySQL: Выберите один кусок данных на дату

В моем текущем проекте я каждый день каждый час подключаю сервер, что приводит к 24 записям в день; со временем это много данных, и я хотел бы, чтобы администратор (в PHP) мог выбрать дату и удалить все данные до этой даты, за исключением одного фрагмента данных в день.

Например. если выбрана дата 2/4/16, то будет удалена вся запись за исключением одной записи в день, начиная с даты 2/4/16.

Структура таблицы базы данных в вопросе:

server_status:
id int(11)
server_id int(11)
time_checked datetime
status char(1)

Мне было интересно, какой оператор MySQL мне нужно будет достичь этого — я посмотрел в интернете, и я вижу, что мне, возможно, потребуется создать новые таблицы, удалить таблицу и заменить ее, но, похоже, это ответ, что он блокирует БД в течение длительного времени. Это больше select заявление, что я запутался-я понимаю, как выбрать данные из до указанной даты, но я не знаю, как 1) выбрать только 1 кусок данных в день, и 2) удалить остальные.

Большое спасибо за помощь!

1 ответ

  1. Это можно сделать с помощью следующего запроса.

    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
    )
    

    Очевидно, что при желании вы можете заменить переменную/параметр sql на PHP/bound.

    Причина, по которой sub-запрос обернут в extra select, заключается в том, что в MySQL вы не можете изменить ту же таблицу, которую вы используете в SELECT part. Упаковка extra select создает неявную временную таблицу, но кажется самым простым и чистым подходом.