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