以下是我正在尝试解决的问题的简化版本。我只是想不出来。
我有两张桌子:
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,但似乎无法获得正确的结果。
答案 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;