Facebookが最近セットアップしたものと同様のプライベートメッセージシステムを再作成しようとしています. 私が問題を抱えている部分は、タイムスタンプ順に異なるスレッドから最新のメッセージのみを選択することです。
これは、これまでに思いついた最も近いクエリです。問題は、受信トレイがスレッドごとに 1 つの行のみを返す必要があり、現在、クエリが同じスレッドから複数の行を返すことです。
SELECT m.created_on, m.thread_id, m.message_id, m.created_by, m.body, u.first_name, u.last_name, u.thumb_img
FROM pms_messages AS m, pms_recips AS r, users AS u
WHERE r.uid =19
AND r.status
IN ('A', 'N'
)
AND r.thread_id = m.thread_id
AND (SELECT max(r.message_id)) = m.message_id
AND m.created_by = u.uid
ORDER BY created_on DESC
これが私の現在のデータベース設定の画像です。クエリが簡素化され、仕事が完了するのであれば、テーブルへの変更を受け入れることができます。さらに下には、私のテーブル/受信トレイの仕様の詳細な説明があります。
もう少し詳しく言うと:
*任意の 2 人のユーザー間のメッセージは、進行中の単一のスレッドで発生します。2 人のユーザー間のすべてのメッセージは、進行中の 1 つの会話 (スレッド) の継続です。両方のユーザーが以前のメッセージをすべて削除しても、将来のメッセージは同じスレッドで発生します。
*個々のメッセージは message_id によって追跡されます。
*各スレッドは、一度だけ受信トレイに表示され、スレッドからの最新のメッセージが表示されます。
※受信箱と送信箱ではなく、同じ受信箱にメッセージが表示されます。
したがって、ユーザー A とユーザー B からまだ読んでいないメッセージがある場合、20 分前にユーザー C から昨日送信されたメッセージに返信しました-10 分前、ユーザー D からの別のメッセージ-2 分前に私の受信トレイは次のようになります。このような:
ユーザー D のスレッド - ユーザー D が私に送ったメッセージを表示します。
ユーザーCのスレッド--ユーザーCに送信したメッセージを表示
ユーザー B とのスレッド - ユーザー B から送信されたメッセージの表示
※表示されているスレッドは、最新のものから古いものへとソートされます。