我认为您不需要 from_id 和 to_id,只需要 from_id。您将按日期确定对话中的第一条和最后一条消息。
但是,为了简单和性能起见,我会制作一个以用户为中心的联结表:
user_id with_user_id conversation_id last_read_id
------- ------------ --------------- --------------
1 2 1 1
1 3 2 0
2 1 1 2
3 1 2 1
然后,对于对话:
id conversation_id from_id content created_on
-- --------------- ------- ------- ----------
1 1 1 hello 2012-06-01 12:00:00
2 1 2 hi 2012-06-01 12:10:01
3 2 3 howdy 2012-06-01 12:40:10
因此,当某人想要开始对话时,您可以检查连接表以查看他们是否已经在与该人进行对话。如果是,请恢复它。
如果是新对话,请确保在联结表中为每个用户添加记录。联结表中的 last_read_id 列引用了对话表中的 id。
要获取用户 1 的所有未读消息:
SELECT c.* FROM junction j
JOIN conversation c
ON c.conversation_id = j.conversation_id
AND c.id > j.last_read_id
WHERE j.user_id = 1
ORDER BY c.created_on DESC
结果是:
id conversation_id from_id content created_on
-- --------------- ------- ------- ----------
3 2 3 howdy 2012-06-01 12:40:10
2 1 2 hi 2012-06-01 12:10:01
要获取用户 1 和用户 2 之间的所有消息(从用户 1 的角度来看):
SELECT c.* FROM junction j
JOIN conversation c
ON c.conversation_id = j.conversation_id
WHERE j.user_id = 1 AND j.with_user_id = 2
ORDER BY c.created_on DESC
结果是:
id conversation_id from_id content created_on
-- --------------- ------- ------- ----------
2 1 2 hi 2012-06-01 12:10:01
1 1 1 hello 2012-06-01 12:00:00