3

ここで、以前の質問を拡張します。

プライベート チャット システム MYSQL クエリ ORDERBY および GROUPBY

さらに、users という名前のテーブルをもう 1 つ作成しました。そこからユーザー情報を取得します。

メッセージ テーブル

  message_id|sender_id||receiver_id|message_text|   created_time
    1         101          102       Message A    2012-06-07 08:07:18
    2         101          102       Message B    2012-06-07 08:10:20
    3         103          102       Message C    2012-06-07 08:12:43

ユーザー テーブル:

 id  | name
 101   bob
 102   jack
 103   mark

最終的に、次の結果を得ることができます。

      name|message_text |  created_time
      mark   message C    2012-06-07 08:12:43
      bob    message B    2012-06-07 08:10:20

このクエリを使用すると、次のようになります。

SELECT * FROM messages,users
WHERE messages.receiver_id = 102
AND messages.sender_id=users.id
AND messages.created_time IN
(SELECT MAX(created_time)
FROM messages
GROUP BY sender_id)
ORDER BY messages.created_time DESC

今、私が結果に欲しいのは

jack(id:102) が mark(id:103) に返信した場合、どうすればこの出力を取得できますか:

      name|message_text |  created_time
      mark   message D    2012-06-07 08:12:48
      bob    message B    2012-06-07 08:10:20

注:ここにある「メッセージ D」とタイムスタンプは、ジャックがマークに返信したものです。

ここで、message_text フィールドには、mark と jack の間の最後のメッセージが表示されます。created_time フィールドにはメッセージの作成時刻が表示され、name フィールドには、jack がメッセージを送受信している相手の名前が表示されます。

テーブルを変更/分割する必要があると考えていますが、このタスクを実行する方法とクエリがわかりません。

4

2 に答える 2

0

これがグループ チャットの場合、次のような receiver_id に制限しないでくださいmessages.receiver_id = 102

SELECT users.name,
       temp.MESSAGE_TEXT,
       temp.created_time
FROM
  (SELECT sender_id, MESSAGE_TEXT, created_time
   FROM messages
   WHERE created_time IN
       (SELECT MAX(created_time)
        FROM messages
        GROUP BY sender_id)) AS temp
LEFT JOIN users ON temp.sender_id = users.id;

各送信者が最後に送信したメッセージを表示

于 2012-06-08T06:06:55.687 に答える
0

あなたが求めているのは、基本的に送信者ではなくスレッドごとにグループ化することです。スレッドは、送信者/受信者に関係なく、2 人の間で開始できます。

これを実現するには、ここで説明した内容に似たデータ構造を変更することをお勧めします: Is there a more simple way to gain this style of user messaging?

于 2012-06-08T05:21:32.910 に答える