Mysql 为每个ID删除比最新记录早2天的记录

Mysql 为每个ID删除比最新记录早2天的记录,mysql,Mysql,我有一张有大约200个不同ID的桌子。每个ID在不同的时间戳上记录了大约100倍的数据。我想为每个ID分别删除比该特定ID的最年轻记录早2天的记录。 Aka,我希望每个ID至少有2天的列表。有些可能是最新的,其他可能是2天,从上个月开始 这行吗 > DELETE FROM loggingTable WHERE (DATE_SUB( MAX(T_log),INTERVAL 48 HOUR)> T_log) GROUP BY ID 我不想删除我的数据….如果您不想意外删除数据,请按以下

我有一张有大约200个不同ID的桌子。每个ID在不同的时间戳上记录了大约100倍的数据。我想为每个ID分别删除比该特定ID的最年轻记录早2天的记录。 Aka,我希望每个ID至少有2天的列表。有些可能是最新的,其他可能是2天,从上个月开始

这行吗

> DELETE FROM loggingTable WHERE (DATE_SUB( MAX(T_log),INTERVAL 48 HOUR)> T_log) GROUP BY ID

我不想删除我的数据….

如果您不想意外删除数据,请按以下方法从最坏到最好处理此问题:

创建数据的副本并处理它。 在事务中执行您的操作。这就像

START TRANSACTION;
DELETE ...;
SELECT ...; /* check if everything worked as expected*/
/*if yes...*/
COMMIT; /* this writes your changes on disk */
/*if not, don't do a commit, but instead...*/
ROLLBACK; /* this undoes all the statements in the transaction */
首先将DELETE语句作为SELECT语句编写。然后检查要删除的内容。如果可以的话,将其转换为DELETE语句,并将此方法与上面的第2点相结合(如果愿意)。例如,如下所示:

SELECT 
*
FROM loggingTable lt
JOIN (SELECT ID, MAX(T_log)AS max_log FROM loggingTable GROUP BY ID) AS m ON lt.ID = m.ID
WHERE lt.T_log < m.max_log - INTERVAL 2 DAY;
如果看起来没问题:

DELETE lt.*
FROM loggingTable lt
JOIN (SELECT ID, MAX(T_log)AS max_log FROM loggingTable GROUP BY ID) AS m ON lt.ID = m.ID
WHERE lt.T_log < m.max_log - INTERVAL 2 DAY;
当然,你也可以将方法2和方法3与方法1结合起来-

一些额外的解释:我将查询加入表的原因是,不能在WHERE子句中使用像MAX这样的聚合函数。sql语句的计算方式如下:

从…起 哪里 分组 有 订购人 选择
由于where子句在group by子句之前求值,因此无法访问其中的聚合函数。它们是通过group by子句引入的。

“我不想删除我的数据…”然后创建一个副本,并在该副本上进行测试…@CBroe。我的意思是:我不想删除太多的数据,并假设我做了我所期望的。然后创建仔细的测试条件,在那里您可以验证它。如果错误,请将测试环境中的数据恢复到创建备份的前一个状态,然后重试。这称为单元测试代码,是编码的一部分。是的,如果你有经验的话,你可以事先确定一段特定的代码只需看一下就可以工作,但通常这种技能需要经过大量的测试和反复试验。因为我们看不到你的数据,所以很难知道你的查询是否会对它起作用,不管怎样,好吧,它不起作用,如果它起作用了,我不会同意。我遗漏了什么?我们不确定,因为我们看不到您的源数据,而您也没有准确地说出哪里出了问题。我们需要一些样本数据和预期输出。另外,您从当前版本的代码中实际获得的输出也会有所帮助。谢谢,我现在明白了。lt.T\u log指向原始表,而m.max\u log指向连接。按ID分组。这就是我要找的。