0

次の2つのテーブルがあります

# Event table
id    title         start_date              end_date
----------------------------------------------------------
1      Foo     2013-05-06 20:30:00     2013-05-06 22:45:00
2      Bar     2013-06-03 07:40:00     2013-05-06 10:45:00
3      Demo    2013-05-02 00:22:00     2013-05-06 03:45:00
4      Test    2013-07-09 10:56:00     2013-05-06 13:45:00

# Notification table
id   event_id         mail         time    type     sent
----------------------------------------------------------
1       1       123@example.com     15    minute     0
2       1       234@example.com     01    day        0
3       3       655@example.com     01    week       0
4       4       888@example.com     40    minute     0
5       4       999@example.com     42    minute     1
5       4       987@example.com     30    minute     0

毎分、cron ジョブは PHP スクリプトを実行して、通知テーブルの電子メール アドレスに通知を送信する必要があるかどうかを確認します。時間の値は、リマインダーを送信するイベントの開始日までの相対時間です。

たとえば、cron ジョブが2013-05-06 20:15:00に実行される場合、メールはメール アドレス123@example.comに送信されます。送信済みフラグも考慮する必要があります。これが 0 に設定されている場合、送信日より前の場合でも、すべての通知を送信する必要があります。たとえば、cron ジョブが2013-07-09 10:26:00に実行される場合、メールは987@example.comおよび888@example.comに送信されます。

私の質問は、実際の (now()) 日付の上記の要件を満たすために、mysql でクエリをどのように取得して通知を取得する必要があるかということです。date_subで試しましたが、実際には成功しませんでした。助けていただければ幸いです。

4

1 に答える 1

1

私が知る限り、この問題には 2 つの部分があります。1 つは、さまざまな単位を時間比較に変換することです。もう 1 つは、通知が 1 つだけ送信されるようにすることです。

case最初のものは大きなステートメントで処理できます。2番目は、不等式ではなく、時間の間隔をチェックすることで処理できます。

. . .
from event e join
     notification n
     on e.id = n.event_id
where (case when n.type = 'minute'
            then now() - interval n.time minute <= e.start_date and
                 now() + interval 1 minute - interval time minute > e.start_date
            when n.type = 'day'
            then now() - interval n.time day <= e.start_date and
                 now() + interval 1 minute - interval time day > e.start_date
            when n.type = 'week'
            then now() - interval 7*n.time day <= e.start_date and
                 now() + interval 1 minute - interval 7*time day > e.start_date
            when n.type = 'month'
            then now() - interval n.time month <= e.start_date and
                 now() + interval 1 minute - interval time month > e.start_date
       end) > 0 and sent = 0;

また、Tom が指摘しているように、特定の時間に依存するのではなく、通知ごとに送信済みフラグを設定する方がよいでしょう。ジョブは、あらゆる種類の理由で遅延する可能性があります。

于 2013-08-27T15:18:42.137 に答える