首页 > 解决方案 > 如何创建 MySQL 查询以在单独的表中返回早于预定义日期的记录

问题描述

我正在为 MySQL 表创建维护查询,我需要根据表中的日期字段将记录标记为可删除(将列值从 0 更新为 1)。

很简单,但我遇到的问题是,将记录标记为可删除的标准因帐户 ID(acc_id 列)而异。

例如,该表将包含来自多个帐户的记录(acc_id 字段),并且有一个单独的帐户表,其中包含一个列(retention_age),我需要使用该列来确定是否可以将记录标记为可删除。

例子:

SELECT * 
  FROM files 
 WHERE DATE(file_downloaded_date) < DATE_SUB(CURDATE(), INTERVAL 30 DAY)
   AND deleted = 0;

例如,在要更新记录的表中,acc_id = 1 可能有 100 条记录,acc_id = 2 有 250 条记录等...... acc_id 1 设置为将记录标记为 14 天后可删除,acc_id 2 是设置为在 30 天后标记为可删除。

我试图弄清楚我是否可以创建一个 SQL 查询来在一个查询中完成这一切,或者我是否需要为每个帐户创建一个单独的查询。

我在想,如果有办法用每条记录的 acc_id 的retention_age 值替换 INTERNAL 30 DAY 中的“30”,那将是最好的方法,但我不知道该怎么做,或者如果这甚至会起作用。

任何建议将不胜感激。

标签: mysql

解决方案


您应该能够使用 aLEFT JOIN来获得相应的帐户并将其retention_age用作INTERVAL

DELETE files FROM files
LEFT JOIN accounts ON accounts.id = files.acc_id
WHERE
    DATE(file_downloaded_date) < DATE_SUB(CURDATE(), INTERVAL accounts.retention_age DAY)
    AND deleted = 0

推荐阅读