我开始为我的网站开发聊天应用程序。
在我到达后端之前,首先我做了一些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小时前
所以我的消息被分组为对话。 我可能有来自user_2的10条消息,但它应该显示为一条消息(以及最后一条消息)
任何想法我下一步怎么样? 因为我还没有做任何PHP方面你甚至可以建议更改数据库以便为你的解决方案进行调整。
感谢。
答案 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`
这将为您提供我作为用户所拥有的所有聊天内容。