Mysql 在同一天删除旧行

Mysql 在同一天删除旧行,mysql,sql,Mysql,Sql,我试图编写一个删除查询,根据日期从数据库中删除旧记录,但问题是同一天可能有多条记录,我只需要保留最近的一条记录 我的问题是: SELECT ItemName, 1_PRICE, 1_STOCK, 2_STOCK, updated FROM inventory WHERE ItemName = "24T7351" ORDER BY updated DESC 下面是SQLFiddle: 所以基本上我想要的是一个查询,它返回所有

我试图编写一个删除查询,根据日期从数据库中删除旧记录,但问题是同一天可能有多条记录,我只需要保留最近的一条记录

我的问题是:

SELECT
    ItemName,
    1_PRICE,
    1_STOCK,
    2_STOCK,
    updated
FROM
    inventory 
WHERE
    ItemName = "24T7351" 
ORDER BY 
    updated DESC
下面是SQLFiddle:

所以基本上我想要的是一个查询,它返回所有按天分组的记录,除了每天最新的记录

伪代码: 挑选* 分组方式更新 按说明订购 每天保持第一排
删除每天的剩余时间

获取子查询中的最近时间,将其与表连接,然后删除

DELETE i1 
FROM inventory AS i1
JOIN (SELECT DATE(updated) AS date, MAX(updated) AS latest
      FROM inventory
      WHERE itemname = '24T7351'
      GROUP BY date) AS i2 ON DATE(i1.updated) = i2.date AND i1.updated != i2.latest
WHERE itemname = '24T7351'

如果您想要每个项目的每个日期的最新记录:

SELECT i.*
FROM inventory i
WHERE i.updated < (select max(i2.updated)
                   from inventory i2
                   where i2.itemname = i.itemname and
                         date(i2.updated) = date(i.updated)
                  )
ORDER BY updated DESC;

像这样的怎么样:

DELETE FROM inventory
WHERE updated NOT IN (
    SELECT updated FROM (
        SELECT MAX(updated) updated
        FROM inventory
        GROUP BY DATE(updated)
    ) i
)
如果您对已更新的索引进行了排序,这将非常有效


基本上,子查询获取每天的所有最大更新日期,并将它们排除在DELETE语句之外。

此解决方案将帮助您为每一行分配一个等级。您可以根据排名进行删除。最新记录排名第一

SELECT
    ItemName,
    BLOCK_1_PRICE,
    M,
    S,
    B,
    P,
    updated,
    if (ItemName=@curItem,@curRank:= @curRank + 1, @curRank:=@reset) AS rank,
    @curItem:=ItemName,
    @curRank,
  @reset,
  @curItem
FROM
    inventory, (select @curRank:=1, @curItem:='NA', @reset:= 1) as r
ORDER BY 
    ItemName,updated DESC
如果您想要除最新记录之外的所有记录,请使用以下查询。我建议您使用最新记录创建一个新表,而不是在库存表较大的情况下删除旧表中的记录。链接到SQLFiddle


where子句使用项目名称。你是说当天所有的项目都有项目名称吗?@NevilleNazerane不抱歉,这只是从一张大桌子上测试一个项目。如果两行在一秒钟内被打断怎么办?你想保留哪一个?@PaulSpiegel总是当天最新的。我真的不想知道原因,因为它可以是任何日期。此查询基本上会保留每天的最新记录,并删除其余的记录。忘记FROM子句他想要每个记录,但每个日期的最新记录除外。@3zzy抱歉,mySQL语法对我来说有点过时:P您需要将子查询进一步包装到一个别名表中。我更新了代码,请再试一次
select * from 
(
SELECT
    ItemName,
    BLOCK_1_PRICE,
    M,
    S,
    B,
    P,
    updated,
    if (ItemName=@curItem,@curRank:= @curRank + 1, @curRank:=@reset) AS rank,
    @curItem:=ItemName,
    @curRank,
  @reset,
  @curItem
FROM
    inventory, (select @curRank:=1, @curItem:='NA', @reset:= 1) as r
ORDER BY 
    ItemName,updated DESC
  ) as t
  where rank > 1