php - GROUP BY 消息 MySQL

标签 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 ;

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

将其视为 Facebook 消息,当您进入实际页面时,有一个左侧边栏,其中包含按对话分组的消息。

输出应该是这样的:

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

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

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

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

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

谢谢。

最佳答案

我假设您会为一个人(“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

关于php - GROUP BY 消息 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348155/

相关文章:

php - Swiftmailer 隐藏来自 MySQL 数据库的用户电子邮件

php - Pear Mail,如何以UTF-8发送纯文本/文本+文本/html

mysql 从字符串列表中获取不同的标记

Php mysql - 获取最近几天的值和条目总数

javascript - Ajax不返回任何结果

存储在 APC 中的 php 对象删除 mySQL 链接

php - 使用 PHP 将推荐数量和推荐 ID 添加到 MySQL 数据库中

mysql - 在mysql的一列中创建多个值

php - 如何使用 PHP 将此日期转换为 mySQL 时间?

mysql - 关闭mysql端口: 3306 and make it local