0

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

首先,我做了一些 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 ;

现在,有了这个数据库,我想请求查看按“发件人”或“收件人”分组的所有消息

把它想象成 facebook 消息,当你进入实际页面时,有一个左侧边栏,其中包含按对话分组的消息。

输出应该是这样的:

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

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

    "user_1" 和 "user_5" 5 小时前的对话

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

任何想法我下一步怎么走?由于我还没有完成任何 php 方面的工作,您甚至可以建议将数据库更改为 adjast 以适应您的解决方案。

谢谢。

4

3 回答 3

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
于 2013-10-13T18:57:23.923 回答
0

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

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

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

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

于 2013-10-13T18:05:23.670 回答
-1

这可以通过一个简单的 group by 查询来完成:

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

这将为您提供我作为用户进行的所有聊天。

于 2013-10-13T17:41:24.910 回答