2013-08-27 43 views
0

我有以下兩個表Mysql的相對日期減法

# 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  [email protected]  15 minute  0 
2  1  [email protected]  01 day  0 
3  3  [email protected]  01 week  0 
4  4  [email protected]  40 minute  0 
5  4  [email protected]  42 minute  1 
5  4  [email protected]  30 minute  0 

每分鐘cron作業執行PHP腳本來檢查的通知應當在通知表發送到電子郵件地址。時間值是應該發送提醒時事件開始日期之前的相對時間。

例如,當cron作業運行在2013年5月6日20點15分00秒電子郵件應該發送到的電子郵件地址[email protected]。發送的標誌也應該被考慮。如果它設置爲0,那麼如果低於發送日期,則也應發送所有通知。例如,當cron作業運行在2013-07-09 10:26:00郵件應發送到[email protected][email protected]

我的問題是,查詢如何看起來像在MySQL中以獲取通知以滿足上述實際(現在())日期的要求?我試過date_sub,但並沒有真正成功。一個幫助真的很感激。

+0

很難說,但一個道理。保持通知表格中的類型是一個醜陋的數據庫設計 –

+0

什麼是更好的方法?您的評論並不真正有幫助! – Laoneo

+0

保留查找表中的所有類型並在通知表中保留其引用可能會加速Gordon的動態計算 –

回答

1

據我所知,這個問題有兩個部分。一種是將不同的單位轉換成時間比較。另一個是確保只有一個通知消失。

第一個可以通過大的case聲明來處理。第二個可以通過檢查的時間間隔來處理,而不是一個不等式:

. . . 
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指出,這將是最好有一個已發送標誌爲每個通知,而不是依賴特定的時間。由於種種原因,工作可能會延遲。

+0

,您有一些語法錯誤。你使用date_sub幾次,但也是加/減間隔。另外你有一對額外的終端夥伴。 – Tom

+0

另外,使用發送的標誌而不是使用日期範圍會更好嗎? – Tom

+0

@Tom。 。 。感謝您的編輯。至於你的第二點評論,我完全同意。取決於具體的時間框架,在大多數環境中可能是危險的。 –