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