【问题标题】:SELECT QUERY WITH UPDATE QUERY,send email if a MYSQL field changesSELECT QUERY WITH UPDATE QUERY,如果 MYSQL 字段更改,则发送电子邮件
【发布时间】:2011-10-29 18:43:10
【问题描述】:

我有一个 cron 作业设置,每 24 小时查看订阅表中的值变化,如下所示,如果当前日期超过订阅的结束日期,则状态字段值变为“非活动”

$curdate=date('Y-m-d'); 

$sql=("UPDATE subscription SET status='inactive' WHERE (end_date < '$curdate')");

我想使用上述 cron 作业向订阅刚刚过期的用户发送一封电子邮件,为此我需要检索同样存储在同一个订阅表中的 user_id..

有没有办法我可以运行 SELECT QUERY 以及上面的 UPDATE QUERY 并检索订阅刚刚过期的用户的 user_id?

谢谢,

【问题讨论】:

  • 在更新之前查询SELECT userid FROM subscription WHERE status = 'inactive' AND end_date &lt; '$curdate' LIMIT 0, 1000
  • Jared,这是行不通的,因为 MYSQL 中将有许多其他条目,其中 (end_date
  • 糟糕,应该是status = 'active'。不知道你说的第二句话是什么意思。
  • 杰瑞德。这就像一个魅力,我已经调整了下面的 Marc B. 响应以显示相同。谢谢,

标签: php mysql select cron sql-update


【解决方案1】:

分两个阶段进行:

SELECT user_id
FROM subscriptions
WHERE status='active' AND (end_date < '$curdate')

检索所有过期的 id。获取该 ID 列表并将其填充到您的更新查询中:

UPDATE subscriptions SET ... WHERE (user_id IN ($list_of_ids_from_before))

然后重新使用 ID 列表生成您的电子邮件。

【讨论】:

  • 你知道,考虑到停用的逻辑,我想知道 status 字段是否是必要的......
  • 在选择查询中?不希望重新向在之前的运行中停用并选择不重新激活的用户发送垃圾邮件。
  • 或者,可以使用另一个通知字段。我只是说,总的来说,“不活跃”的逻辑似乎很清楚(一般来说,并不是对您的答案的评论)。
  • 第一步是选择 user_id 状态为活动和 end_date
【解决方案2】:

你可以

A.首先运行您的选择并获取即将过期的 user_id,然后运行查询以使它们过期。如果第一次失败,您可能会运行两次更新。

B.您可以在订阅时创建触发器,以将记录写入过期通知队列或您的 cron 脚本可以使用并生成电子邮件的类似内容

C.您可以在订阅表中添加过期日期,然后在事后查询该表以查找“今天”过期的订阅

【讨论】:

    【解决方案3】:

    使用事务,先执行具有相同 WHERE 条件的 SELECT 语句。

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      相关资源
      最近更新 更多