Mysql удалить все строки, добавленные каждую минуту, но оставить только 1 - PullRequest
0 голосов
/ 28 января 2019

У меня есть MySQL таблица с именем datas и столбец, подобный этому;

id int(11)
currency varchar(16)
date_time (datetime)

Пример данных:

id         currency      date_time
---------  ------------  ---------------------
12         EURUSD        2019-01-28 11:19:26
13         EURUSD        2019-01-28 11:19:29
14         EURUSD        2019-01-28 11:19:34
15         EURUSD        2019-01-28 11:19:38
16         EURUSD        2019-01-28 11:19:49
17         GBPUSD        2019-01-28 11:19:23
18         GBPUSD        2019-01-28 11:19:27
19         GBPUSD        2019-01-28 11:19:39
20         GBPUSD        2019-01-28 11:19:45
21         GBPUSD        2019-01-28 11:19:57

ДОЛЖЕН БЫТЬ ТАК ЭТОМ (УДАЛИТЬ ДРУГИЕ В ТОЛЬКО 1 МИНУТУ 1 СТРОКУВ КАЖДУЮ ВАЛЮТУ);

12         EURUSD        2019-01-28 11:19:26
17         GBPUSD        2019-01-28 11:19:23

И моя программа вставляет строки примерно каждые 3-6 секунд.но я хочу сохранить только одну валютную цену за 1 минуту, и я хочу удалить другие.

Как я могу сделать это с помощью запроса MySQL?Я использую php.

Мои задания cron будут работать каждые 15 минут.с php будет работать этот запрос.

Mysql версия = 5.7.25

Спасибо за идеи.

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы можете использовать группу NOT IN min id (или max, если вы предпочитаете) по минутам и валюте

delete from my_table  
where id NOT IN  (
    select  my_id 
    from (
    select  min(id) my_id
    from  my_table 
    GROUP BY currency
        , YEAR(date_time)
        , month(date_time)
        , day(date_time)
        , HOUR(date_time)
        , MINUTE(date_time)
    ) T
) 
0 голосов
/ 28 января 2019

Вы можете использовать это:

DELETE FROM t
WHERE (currency, date_time) NOT IN (
    SELECT * FROM (
        SELECT currency, MIN(date_time)
        FROM t
        GROUP BY currency, UNIX_TIMESTAMP(date_time) - UNIX_TIMESTAMP(date_time) % (1 * 60)
    ) AS x
)

Выражение UNIX_TIMESTAMP(datetime) - UNIX_TIMESTAMP(datetime) % (n * 60) будет помещать значение даты и времени в n * 60-секундную границу , как описано здесь .Вы можете сгруппировать по этому выражению, чтобы найти currency, MIN(datetime) пар внутри каждой группы.

0 голосов
/ 28 января 2019

Вы можете попробовать ниже -

delete  b from datas b join
(
SELECT 
    @row_number:=CASE
        WHEN @currency = currency THEN @row_number + 1
        ELSE 1
    END AS num,id
    @currency:=currency as currency,date_time
FROM
    datas,(SELECT @currency:=0,@row_number:=0) as t
ORDER BY currency
)A on a.id=b.id where num<>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...