GROUP BY消息MySQL

时间:2013-10-13 17:32:42

标签: php mysql

我开始为我的网站开发聊天应用程序。

在我到达后端之前,首先我做了一些javascript部分。 现在刚刚创建了数据库结构:

CREATE TABLE IF NOT EXISTS `wp_bp_my_chat` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `from` varchar(255) NOT NULL DEFAULT '',
  `to` varchar(255) NOT NULL DEFAULT '',
  `message` text NOT NULL,
  `sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `recd` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `to` (`to`),
  KEY `from` (`from`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

现在,有了这个数据库,我想要求查看按“from”或“To”分组的所有消息

将其视为Facebook消息,当您转到实际页面时,会出现一个左侧边栏,其中包含按对话分组的消息。

输出应该是:

  • “user_1”与“user_2”(未读)之间的对话2小时前

    3个小时前“user_1”和“user_3”(未读)之间的对话

    5个小时前“user_1”和“user_5”之间的对话

所以我的消息被分组为对话。 我可能有来自user_2的10条消息,但它应该显示为一条消息(以及最后一条消息)

任何想法我下一步怎么样? 因为我还没有做任何PHP方面你甚至可以建议更改数据库以便为你的解决方案进行调整。

感谢。

3 个答案:

答案 0 :(得分:2)

我假设你会为一个人('user_1')为他们的对话运行这个,这意味着他们可以是来自或来自。我还假设,如果他们是来自或来自,那么没有区别,而是由对话中的其他人分组。如果是这样,试试这个。 (您应该将一些示例数据放在SQLFiddle中进行测试)

SELECT MostRecent.MainPerson AS MainPerson
  , MostRecent.OtherPerson AS OtherPerson
  , MostRecent.Sent AS Sent
  , IF(wp_bp_my_chat.recd = 0, 'Unread','Read') AS Status
FROM wp_bp_my_chat
JOIN (
    SELECT 'user_1' AS MainPerson
       , IF(msgs.`from` = 'user_1',msgs.to, msgs.`from`) AS OtherPerson
       , MAX(msgs.sent) AS sent
    FROM wp_bp_my_chat AS msgs
    WHERE msgs.`from` = 'user_1' OR msgs.`to` = 'users_1'
    GROUP BY MainPerson, OtherPerson) AS MostRecent
  ON (wp_bp_my_chat.`from` = MostRecent.MainPerson OR wp_bp_my_chat.`to` = MostRecent.MainPerson)
    AND (wp_bp_my_chat.`from` = MostRecent.OtherPerson OR wp_bp_my_chat.`to` = MostRecent.OtherPerson)
    AND MostRecent.sent = wp_bp_my_chat.sent
ORDER BY sent DESC

答案 1 :(得分:0)

要获得更新中描述的结果,请使用:

SELECT count(*), max(sent) 
FROM wp_bp_my_chat
WHERE to = 'name of recipient'
GROUP BY from 

count(*)为您提供消息数量,max(sent)为您提供最新消息的时间,您可以使用它来计算输出的“小时前”部分。

我没有在表格中看到是否已阅读该邮件的标志。您需要添加它才能添加“(未读)”文本。

答案 2 :(得分:-1)

这可以通过查询的简单组来完成:

SELECT * FROM `wp_bp_my_chat` WHERE `to` = {my_id} GROUP BY `from`

这将为您提供我作为用户所拥有的所有聊天内容。