我正在创建一个php脚本,我在其中获取已发送日期和时间的电子邮件地址。 在我的数据库中我有一个表格电子邮件,其中包含以下列。
1.communication_id
2.name
3.status
4.email
5.senddate
这是我提取电子邮件的查询。
"SELECT email FROM `emails` WHERE senddate <= NOW() AND status = 'pending'
这个查询是对的吗?如果不是需要改变什么?
答案 0 :(得分:0)
查询本身看起来不错,但仍有两件事需要
以下是您需要添加的索引
ALTER TABLE emails ADD INDEX status_senddate_ndx (status,senddate);
这会将所有待处理的电子邮件分组在一起,然后按时间顺序排序。这将有助于对标记为待定的日期时间进行索引范围扫描。
您应收集所有待处理电子邮件的communication_id
SELECT communication_id,email FROM `emails` WHERE senddate <= NOW() AND status = 'pending';
您需要返回这些相同的ID,才能从表中删除电子邮件或更改“待定”状态。发送&#39;发送电子邮件后。
答案 1 :(得分:0)
从技术上讲,您的方法可以作为最低要求。它引出了一个问题:返回的电子邮件&#39;价值包含。它是单独的email_values表中的电子邮件的ID(包含正文,主题,收件人等),还是仅包含收件人的电子邮件地址,其中电子邮件的主题和正文是默认值?
另外,对于您的方法,您必须更新“等待”状态。对其他事情 - 还有senddate呢?您也要更新它,因此会丢失有关何时插入请求的信息,或者您不会丢失有关脚本何时发送您的电子邮件的信息。
更好的解决方案是将status和status_date放入一个单独的表中(以及communication_id或电子邮件的外键 - 如果后者在内部加入电子邮件表时是唯一的)。这将允许您通过插入而不是更新来插入新的通信步骤,从而防止信息丢失。