我认为您不需要 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