MySQL删除每分钟添加的所有行,但仅保留1

时间:2019-01-28 08:23:39

标签: php mysql sql datetime pdo

我有一个名为path=的MySQL表和类似的列;

datas

示例数据:

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

必须像这样(在每个货币中仅用1分钟的行删除其他对象);

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
  

我的程序大约每3-6秒插入一行。   但我想在1分钟内只保留1种货币的价格,并且我想删除其他货币。

我该如何使用mysql查询呢? 我正在使用php。

  

我的Cron工作每15分钟工作一次。使用php将可以执行此查询。

Mysql版本= 5.7.25

感谢创意。

3 个答案:

答案 0 :(得分:1)

您可以使用此:

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)将datetime值设置为n * 60秒边界as described here。您可以按此表达式分组以在每个组中找到currency, MIN(datetime)对。

答案 1 :(得分:0)

您可以在下面尝试-

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

答案 2 :(得分:0)

您可以按分钟和货币使用NOT IN的最小ID(如果愿意,也可以使用最大ID)分组

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
)