1

我有三张表——notices、notices_read 和 company。Notices 包含显示在 Web 应用程序中的客户通知列表,notices_read 指示他们已单击并阅读消息,因此在公司持有公司信息(包括其加入日期)时不会再次显示。此外,我只想将通知显示给加入时间超过 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')
4

1 回答 1

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')
于 2012-12-21T16:06:26.883 回答