1

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 から送信されたメッセージの表示


※表示されているスレッドは、最新のものから古いものへとソートされます。

4

2 に答える 2

1

JOIN次のテーブルpms_messagesを使用します。

SELECT thread_id, MAX(Created_ON) AS NewestDate
FROM messages 
GROUP BY thread_id

次に、MAX(Created_ON). このような:

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
INNER JOIN
(
   SELECT thread_id, MAX(Created_ON) AS NewestDate
   FROM messages 
   GROUP BY thread_id
) AS m2  ON m.created_on = m2.Newestdate
        AND m.thread_id  = m2.thread_id
INNER JOIN pms_recips AS r ON r.thread_id  = m.thread_id
INNER JOIN users      AS u ON m.created_by = u.uid
WHERE r.uid =19
  AND r.status IN ('A', 'N')
ORDER BY created_on DESC;

更新 1

2 つのテーブル間の条件にを追加r.message_id = m.message_idします。このような:JOINpms_messagespms_recips

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
INNER JOIN
(
   SELECT thread_id, MAX(Created_ON) AS NewestDate
   FROM pms_messages
   GROUP BY thread_id
) AS m2  ON m.created_on = m2.Newestdate
        AND m.thread_id  = m2.thread_id
INNER JOIN pms_recips AS r  ON r.thread_id  = m.thread_id 
                           AND r.message_id = m.message_id
INNER JOIN users      AS u  ON m.created_by = u.uid
WHERE r.uid =19
  AND r.status IN ('A', 'N')
ORDER BY created_on DESC;

SQL フィドルのデモ

于 2013-02-24T06:06:19.280 に答える