2011-11-10 71 views
0

我想這比SQL更像一個設計模式問題。基於事件/時間和標準的SQL

在我的應用程序中,用戶可以加入,可以在他們的商店中創建商店並加載產品(因此可以說有一個用戶,商店(一對一)和產品(與商店多對一)

因此,我希望能夠根據時間和標準(但只有一次)做某些事情,例如,如果加入用戶後一週沒有商店,我想發送電子郵件,或者在加入店,但沒有產品發送電子郵件等 - 但我只想做一次

它唯一的一次運行該做我的頭 - 因此,例如,可以說我有這個查詢

select * from user where joineddt < '1 week ago date' 

而且我有一個腳本,每3小時運行一次,觸發SQL,然後執行任何事件(例如,發送電子郵件)然後我想確保這個腳本是否被再次觸發,它不會接收任何已經被處理的用戶。我想過介紹一個'事件'表,一旦用戶的事件被解僱,爲該事件記錄一個條目,但這似乎不起作用。例如說我有事件表,有ID,用戶,事件

select * from user a 
left join event b on b.user = a.id 
where a.joineddt < '1 week ago date' 
and b.event = 'userjoined' 
and b.id is null 

因此,當存在事件沒有進入能夠爲「userjoined」事件,它會返回任何結果......不過說真的我想讓它返回事件表中沒有事件的用戶,這個「userjoined」事件?

那麼,任何人都可以想出一種方法來做我的建議嗎?

回答

1

您的查詢將始終返回0行,因爲如果b.id爲null,則b.event永遠不會「用戶連接」。 將'userjoined'標準移至join子句。

SELECT a.* 
FROM user a 
LEFT JOIN event b ON (b.user = a.id AND b.event = 'userjoined') 
WHERE a.joineddt < '1 week ago date' 
AND b.id IS NULL 
+0

謝謝 - 正是我在找的東西! – Xrender

0

您不需要額外的表(連接費用很高)來實現您的解決方案。在你的用戶表中,只需添加兩個可以爲空的日期列:'date_joined'和'reminded'。確保您的應用程序邏輯(您可以定義到表/數據庫端)默認'date_joined'加入日期,'提醒'爲NULL。

要拿起用戶需要一個提醒:

SELECT * FROM users 
WHERE date_joined > '1 week ago' AND reminded IS NULL 

請務必填寫「提醒」與日期,一旦你已經發送的電子郵件。這樣腳本的下一次運行就不會起作用。

+0

2個事件只是一個例子,有很多事件,我希望隨着時間的推移添加更多事件,不想爲每種類型的事件添加列。在費用方面,它將是一個定期運行的脫機守護程序,所以不應該有影響。 – Xrender