【问题标题】:Single Table Messaging System in MySQLMySQL中的单表消息系统
【发布时间】:2013-06-20 15:01:25
【问题描述】:

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

【问题讨论】:

  • " 如果 parent_id=NULL 则它是一条新消息" - 那么 parent_id 'not null' 怎么办?
  • 耻辱,NULL 的想法更好!
  • 你真正想要展示的东西是什么?
  • 发件人、主题和正文、日期
  • 谢谢Yak,我在问题中添加了查询,请检查。感谢您的回复。

标签: php mysql sql


【解决方案1】:

这将为您提供发送给 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' 的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多