-5

我目前正在为我的一个项目开发一个消息传递系统。我正在使用单个表来存储消息回复(即使用 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则它是一条新消息

谁是发送该消息的- 即新娘成员。我有两个单独的表格用于新娘和会员的详细信息。

现在我想要一个查询来列出收件箱中的消息(就像 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

这将为您提供发送给标识为 ID 的人的所有顶级消息(即不是回复)1,以及对这些消息的所有直接回复(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 回答