我有一张200左右不同身份证的桌子。每个ID在不同时间戳记记录的数据大约为100倍。我想为每个ID分别删除比该特定ID最年轻记录早2天的记录。 阿卡,我想为每个ID提供至少2天的清单。有些可能是CURRENTDATE,其他列表可能是2天,从上个月开始。
这会有用吗?:
> DELETE FROM loggingTable WHERE (DATE_SUB( MAX(T_log),INTERVAL 48 HOUR)> T_log) GROUP BY ID
我不想删除我的数据......
答案 0 :(得分:0)
如果您不想意外删除数据,请通过以下方式解决此问题(从最差到最佳):
在交易中进行操作。这可以像
一样工作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结合使用; - )
一些额外的解释:我加入查询表的原因是,您不能在MAX()
子句中使用聚合函数(如WHERE
)。 sql语句的计算方式如下:
因为在where
子句之前评估group by
子句,所以无法访问那里的聚合函数。它们随group by
子句一起引入。