1

私には3つのテーブルがあります-notices、notices_read、companysです。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は14日経過していないため、会社1または2には表示されません。
  • 通知1はすでに読まれているため、会社3には表示されません。
  • 通知1は未読であり、会社4は14日以上経過しているため、会社4に表示する必要があります。

これが私の質問です:

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 に答える