-5

私は現在、私のプロジェクトの 1 つのメッセージング システムに取り組んでいます。メッセージ返信を保存するために単一のテーブルを使用しています(つまり、parent_idを使用)。

テーブル構造は次のとおりです。

    CREATE TABLE IF NOT EXISTS `messages` (
          `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
          `parent_id` int(10) unsigned NULL,
          `sender_id` int(10) unsigned NOT NULL,
          `receiver_id` int(10) unsigned NOT NULL,
          `who` enum('bride','member') NOT NULL,
          `subject` varchar(200) NOT NULL,
          `body` text NOT NULL,
          `sent_date` datetime NOT NULL
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;    

ここで、 parent_idは返信したメッセージの ID です。parent_id=NULLの場合、新しいメッセージです

そのメッセージを送信したのは誰ですか-つまり、花嫁またはメンバー. 花嫁とメンバーの詳細用に 2 つの個別のテーブルがあります。

ここで、INBOX 内のメッセージを一覧表示するクエリが必要です (GMAIL のように、一連の会話 [メッセージ + 返信])。

クエリの作成を手伝ってもらえますか?

これは私が取り組んでいたものです:

SELECT id
     , parent_id
     , sender_id
     , receiver_id
     , who
     , subject
     , body
     , sent_date 
  FROM `messages` 
 WHERE sent_date IN ( SELECT MAX( sent_date ) FROM `messages` WHERE receiver_id = 1 GROUP BY sender_id ) 
   AND who = 'bride' 
   AND receiver_id = 1 
 ORDER 
    BY id DESC 
 LIMIT 0, 8
4

1 に答える 1

0

これにより、 ID1で識別される人に送信されたすべてのトップレベル メッセージ (つまり、返信ではない) と、これらのメッセージに対するすべての直接返信 (1 レベルの深さ、再帰なし) が得られます。

SELECT
    messages.*,
    replies.*
FROM messages
LEFT JOIN messages AS replies ON (replies.parent_id = messages.id)
WHERE messages.receiver_id = 1
ORDER BY id messages.sent_date, replies.sent_date

サンプル コードから、最新のメッセージ (およびその返信) のみが必要なように見えます。

SELECT
    lastMessage.*,
    replies.*
FROM (
    SELECT * FROM messages ORDER BY sent_date
    WHERE messages.receiver_id = 1
    LIMIT 1 
) AS lastMessage
LEFT JOIN messages AS replies ON (replies.parent_id = lastMessage.id)
ORDER BY id replies.sent_date

状態は分かりませんwho = 'bride'が。

于 2013-06-24T10:11:52.247 に答える