select SQL 最近 X 天的 ID 如何确保不丢失值
How to be sure to not lose values when select the ID of last X days in SQL
向您介绍我的问题的背景:我想通过电子邮件接收 在最后 15 天.[=13= 中创建的东西的 ID 和创建日期]
我想在 PHP 中 每 15 天 调用一个函数。我通过创建一个 CRON 任务来做到这一点,该任务 触发 每个月 的第 1 天和第 16 天 。
这是我的请求 SQL 请求 :
SELECT ID,
creation_date
FROM mytable
WHERE creation_date > DATE_SUB (NOW (), INTERVAL 16 DAY)
我担心 失去价值。这样做的好方法是什么?
谢谢
如果您想确保不丢失任何数据,我有一个 table 已经通知了 ID:
NotificationsLog
ID, batchGuid, batchDate
(批次日期仅供参考,此过程不需要)。在我的 php 中,我会制作一个新的 Guid,然后 运行 插入:
INSERT INTO Notifications
SELECT t.ID, @guidFromPhp, NOW()
FROM mytable t
LEFT JOIN notificationslog n on n.id = t.id
WHERE n.ID is null
这 select 获取所有新数据(新数据不在日志 table 中),这要归功于左连接查找 null。所有新数据都针对同一个批次 GUID 进行记录。
然后我会提取行并根据相同的 Guid 通过电子邮件发送它们:
SELECT t.ID, t.Whatever
FROM mytable t
INNER JOIN notificationslog n on n.id = t.id
WHERE n.batchGuid = @guidFromPhp
这里不需要日期,也没有数据丢失;每次 运行 时,进程都会通过电子邮件发送所有未通过电子邮件发送的数据。如果您每 15 天 运行 它会执行最近 15 天的所有操作(除了第一个 tine 它 运行s。用所有当前数据预加载日志以避免这种情况)。如果您 运行 每 30 分钟获取一次最近 30 分钟的数据
如果存在发送电子邮件失败的风险,您可以使用状态增强日志 table(或者只是从 n 中删除该条目 - 接下来 运行 将再次拾取)
最简单的解决方案:
像这样在 table 中添加一列 isNotified
:
| ID | creation_date | isNotified |
|----|---------------|------------|
| 1 | 2020-03-26 | 1 |
| 2 | 2020-04-09 | 0 |
| 3 | 2020-04-10 | 0 |
然后,将您的请求更新为 select 只有未发送的项目:
SELECT ID,creation_date FROM mytable WHERE isNotified=false
// Send your mail
如果发送成功,请更新列以将 isNotified
设置为 True
,如下所示:
UPDATE mytable SET isNotified = true WHERE isNotified = false
设置 CRON 选项卡以触发每月 1st 和 15th。
向您介绍我的问题的背景:我想通过电子邮件接收 在最后 15 天.[=13= 中创建的东西的 ID 和创建日期]
我想在 PHP 中 每 15 天 调用一个函数。我通过创建一个 CRON 任务来做到这一点,该任务 触发 每个月 的第 1 天和第 16 天 。 这是我的请求 SQL 请求 :
SELECT ID,
creation_date
FROM mytable
WHERE creation_date > DATE_SUB (NOW (), INTERVAL 16 DAY)
我担心 失去价值。这样做的好方法是什么? 谢谢
如果您想确保不丢失任何数据,我有一个 table 已经通知了 ID:
NotificationsLog
ID, batchGuid, batchDate
(批次日期仅供参考,此过程不需要)。在我的 php 中,我会制作一个新的 Guid,然后 运行 插入:
INSERT INTO Notifications
SELECT t.ID, @guidFromPhp, NOW()
FROM mytable t
LEFT JOIN notificationslog n on n.id = t.id
WHERE n.ID is null
这 select 获取所有新数据(新数据不在日志 table 中),这要归功于左连接查找 null。所有新数据都针对同一个批次 GUID 进行记录。
然后我会提取行并根据相同的 Guid 通过电子邮件发送它们:
SELECT t.ID, t.Whatever
FROM mytable t
INNER JOIN notificationslog n on n.id = t.id
WHERE n.batchGuid = @guidFromPhp
这里不需要日期,也没有数据丢失;每次 运行 时,进程都会通过电子邮件发送所有未通过电子邮件发送的数据。如果您每 15 天 运行 它会执行最近 15 天的所有操作(除了第一个 tine 它 运行s。用所有当前数据预加载日志以避免这种情况)。如果您 运行 每 30 分钟获取一次最近 30 分钟的数据
如果存在发送电子邮件失败的风险,您可以使用状态增强日志 table(或者只是从 n 中删除该条目 - 接下来 运行 将再次拾取)
最简单的解决方案:
像这样在 table 中添加一列 isNotified
:
| ID | creation_date | isNotified |
|----|---------------|------------|
| 1 | 2020-03-26 | 1 |
| 2 | 2020-04-09 | 0 |
| 3 | 2020-04-10 | 0 |
然后,将您的请求更新为 select 只有未发送的项目:
SELECT ID,creation_date FROM mytable WHERE isNotified=false
// Send your mail
如果发送成功,请更新列以将 isNotified
设置为 True
,如下所示:
UPDATE mytable SET isNotified = true WHERE isNotified = false
设置 CRON 选项卡以触发每月 1st 和 15th。