检索自上次访问/读取以来已更新时间戳的记录

时间:2014-01-28 14:01:43

标签: php mysql

以下是我正在尝试解决的问题的简化版本。我只是想不出来。

我有两张桌子:

Table 1: messages
id | timestamp | message
------------------------
1 | 2014-01-20 09:00:00 | Hello I'm a message
2 | 2014-01-20 09:00:00 | Second message for you
3 | 2014-01-27 11:00:00 | This message has been updated
4 | 2014-01-28 13:45:00 | Last message for now

Table 2: reads
id | message_id | user_id | last_read_timestamp
------------------------
1 | 1 | 1 | 2014-01-20 09:10:00
1 | 2 | 1 | 2014-01-20 09:15:00
1 | 3 | 1 | 2014-01-24 19:25:00
1 | 1 | 2 | 2014-01-28 13:45:00
表a中的

id与表2中的message_id有关。

表A中的消息经常更新,时间戳更新。因此,我需要运行一个查询,该查询将返回已更新的任何消息的表A id,因为它们是针对特定user_id读取的,因为用户尚未读取(因此表2中没有相应的条目。 / p>

因此,对于user_id = 1,message_id 3自读取后已更新,而message_id 4是新消息。 user_id = 1的结果是:

Unread
------
3
4

我在表之间尝试过LEFT JOIN,但似乎无法获得正确的结果。

2 个答案:

答案 0 :(得分:1)

如果您只需要为单个用户检索未读的邮件,则可以使用以下内容:

SELECT messages.id AS unread
FROM
  messages LEFT JOIN (SELECT message_id, MAX(last_read_timestamp) as last_rd
                      FROM reads
                      WHERE user_id = 1
                      GROUP BY message_id) lr
  ON messages.id = lr.message_id
     AND messages.timestamp < lr.last_rd
WHERE
  lr.message_id IS NULL

答案 1 :(得分:0)

表A已经更新的任何消息的ID,因为它们是针对特定user_id读取的;将给出以下查询。(未测试)

select * from table1
left join table2 on (table1.id=table2.message_id && table1.timestamp>table2.last_read_timestamp)
where table2.user_id=1;