2012-12-21 69 views
1

我有三張表 - 通知,notices_read和公司。通知包含顯示在Web應用程序中的客戶通知列表,notices_read指示他們點擊並讀取消息,以便在公司持有包括其加入日期在內的公司信息時不再顯示。此外,我只希望向14天前加入的客戶展示此通知。僅當日期少於14天前才顯示

一切工作欄在14天前的部分 - 如果我刪除該行通知顯示正確取決於在notices_read中是否有值,但如果我添加日期行,然後沒有錯誤,沒有任何返回。

companies 
+-----------------+ 
| id | datestamp | 
+-----------------+ 
| 1 | 2012-12-20 | 
| 2 | 2012-12-20 | 
| 3 | 2012-11-20 | 
| 4 | 2012-11-20 | 
+-----------------+ 

notices_read 
+-----------------------------+ 
| id | company_id | notice_id | 
+-----------------------------+ 
| 1 | 3   | 1   | 
+-----------------------------+ 

notices 
+----------------------+ 
| id | title | active | 
+----------------------+ 
| 1 | title1 | 1  | 
| 2 | title2 | 0  | 
+----------------------+ 
  • 注意2不應該顯示爲沒有將其設置爲主動
  • 注意事項1不應該展現給公司1或2,因爲它們不是14天
  • 注意事項1不應該展現給公司3,因爲它已經被閱讀
  • 注意事項1應該展現給公司4,因爲它沒有被閱讀和公司4是超過14天

這裏是我的查詢:

Select 
    notices.description, 
    notices.id, 
    notices.title, 
    notices_read.company_id, 
    companies.datestamp 
From 
    notices Left Join 
    notices_read On notices.id = notices_read.dismiss_id Left Join 
    companies On notices_read.company_id = companies.id 
Where 
    notices.active = 1 And 
    companies.datestamp <= DATE_SUB(SYSDATE(), Interval 14 Day) And 
    (notices_read.company_id Is Null Or notices_read.company_id != '$company_id') 
+0

我認爲這個問題是與連接,而不是雖然我意識到我的約會是錯誤的 - 我已經改變了來自和加入,因爲我需要顯示來自通知的數據而不是來自notices_read,它仍然沒有工作,但我認爲這是因爲我加入表1到表2然後嘗試ng將表2連接到表3 – bhttoan

回答

3

如果我理解正確你的問題,你只需要使用DATE_SUB

DATE_SUB(SYSDATE(), Interval 14 Day) 

完整的查詢是:

Select 
    notices.description, 
    notices.id, 
    notices.title, 
    notices_read.company_id, 
    companies.datestamp 
From 
    notices_read Left Join 
    notices On notices_read.dismiss_id = notices.id Left Join 
    companies On notices_read.company_id = companies.id 
Where 
    notices.active = 1 And 
    companies.datestamp <= DATE_SUB(SYSDATE(), Interval 14 Day) And 
    (notices_read.company_id Is Null Or notices_read.company_id != '$company_id') 
+1

請注意,由於'WHERE'子句的要求'companies.datestamp'爲非null,所以您的第二個'Left Join'實際上等同於'Inner Join'(內部連接)任何沒有「公司」組件的記錄將被丟棄)。此外,這也意味着您的'notices_read.company_id爲Null Or'沒有任何效果,因爲當'notifications_read.company_id'爲null時,連接永遠不會成功。 – ruakh

+0

我通過做三個選擇得到這個工作,但你的答案在日期(這是我原來的問題)是正確的,所以我已經接受你的答案 - 謝謝你 – bhttoan