MySQL:仅返回平面/对话消息表中的最后一条消息

2023-12-06

我正在编写一个消息系统,例如 Facebook 的新消息系统,其中两个用户之间的整个来回被视为一次对话。 (与传统电子邮件相反,传统电子邮件中的每个回复都是单独的消息,或者与 gMail 的对话相反,在 gMail 对话中,回复全部集中在一个对话中,但您仍然可以在人与人之间进行多个对话)。 MySQL 版本是 5.0.92。

我一生都无法弄清楚如何编写“收件箱”类型视图的查询。我所需要的只是两个人之间的最后一条信息会很容易但我不知道如何考虑“from_id”和“to_id”字段。

My messages table looks like this: messages table

突出显示的行是我想要返回的行(例如,不会返回#2,因为用户 42 和 43 之间的最后一条消息是#8)。是否有可能做到这一点?或者我最好使用两个查询(一个用于 to_id,一个用于 from_id),然后在 PHP 中进行计算?

感谢您的帮助

复制表的 SQL:

CREATE TABLE `messages` (
  `message_id` bigint(20) NOT NULL auto_increment,
  `to_id` int(11) NOT NULL,
  `from_id` int(11) NOT NULL,
  `message_sent` datetime NOT NULL,
  `message_body` text NOT NULL,
  `is_read` tinyint(1) NOT NULL default '0' COMMENT '0 = no, 1 = yes',
  PRIMARY KEY  (`message_id`),
  KEY `to` (`to_id`),
  KEY `is_read` (`is_read`),
  KEY `sent` (`message_sent`),
  KEY `from` (`from_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

INSERT INTO `messages` (`message_id`, `to_id`, `from_id`, `message_sent`, `message_body`, `is_read`) VALUES
(1, 42, 43, '2011-04-01 11:54:05', 'message 1', 0),
(2, 43, 42, '2011-04-01 11:54:05', 'message 1.2', 0),
(3, 42, 44, '2011-04-01 11:55:05', 'message 2', 1),
(4, 44, 42, '2011-04-01 11:55:02', 'message 2.1', 0),
(5, 43, 44, '2011-04-01 15:05:42', 'Message 3', 0),
(6, 44, 43, '2011-04-01 15:05:58', 'Message 3.1', 0),
(7, 42, 43, '2011-04-02 11:54:05', 'message x', 0),
(8, 43, 42, '2011-04-02 11:54:05', 'message x.2', 0);

编辑:对于那些有兴趣的人:

select `m`.`message_id` AS `message_id`,`m`.`to_id` AS `to_id`,`ut`.`name` AS `to_name`,`m`.`from_id` AS `from_id`,`uf`.`name` AS `from_name`,`m`.`message_sent` AS `message_sent`,`m`.`message_body` AS `message_body`,`m`.`is_read` AS `is_read` from ((`messages` `m` join `users` `ut` on((`m`.`to_id` = `ut`.`id`))) join `users` `uf` on((`m`.`from_id` = `uf`.`id`))) where `m`.`message_id` in (select max(`messages`.`message_id`) AS `MAX(message_id)` from `messages` group by greatest(`messages`.`to_id`,`messages`.`from_id`),least(`messages`.`to_id`,`messages`.`from_id`));

SELECT MAX(message_id) FROM messages GROUP BY GREATEST(to_id, from_id), LEAST(to_id, from_id);

如果您想要消息本身,您可以将其放入子选择中,或者将其转换为视图并将其与消息连接起来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL:仅返回平面/对话消息表中的最后一条消息 的相关文章

  • REPLACE MYSql 中的新行字符不起作用

    我执行了以下查询 由于某种原因它没有替换数据库中的换行符 它说 Rows matches 1 但没有变化 有什么问题吗 mysql gt UPDATE aboutme SET abouttext REPLACE abouttext n WH
  • mysql查询先慢后快

    我有 2 个 myISAM 表 分别称为 tests 和 completed tests 一个有 170 个条目 另一个有 118k 条目 当我运行此查询时 SELECT ct archive ct status ct score ct u
  • 错误:列“this_.phitorsionangle”必须出现在 GROUP BY 子句中或在聚合函数中使用

    我在执行 sql 查询时遇到了一些问题 我正在使用 Hibernate Criteria 来构建查询 我通过按一定间隔 binSize 舍入值然后对它们进行分组来从数据库创建一些容器 当我直接在 SQL 中使用查询尝试时 效果非常好 SEL
  • 启动服务器后,带有sequelize的Nodejs无法在mysql工作台中创建表

    我开始学习如何使用构建 Rest APINodejs Expressjs Sequelize and MySQL using Mysqlworkbench 我的问题 启动服务器后 该表不是由Sequelize并且没有表Mysqlworkbe
  • 防止重复数据输入mysql数据库

    我试图让我的电子邮件订阅服务拒绝数据库中已存在的电子邮件 这样用户就不会订阅同一封电子邮件两次 这就是我所拥有的 但它不起作用 有什么想法吗
  • PHP 5.4 PDO 无法使用旧的不安全身份验证连接到 MySQL 4.1+

    我知道有很多类似的问题 事实上我已经阅读了所有 9 个问题 但是 他们都没有解决我的问题 我有一个共享托管包 最低限度 我的包中包含域名和托管 MySQL 服务器的单独 IP 地址 为了开发 我正在使用http localhost 与 PH
  • 重复键错误不会取消/回滚mysql事务

    当在 mysql innodb 事务中时 我希望重复的键错误会导致回滚 它没有 相反 它只是抛出一个错误并继续执行下一个命令 一旦到达 COMMIT 命令 事务将被提交 没有重复键导致命令 这是预期的行为吗 如果是这样 如何设置它以便在发生
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max
  • MySQL 查询中的窗口函数

    有没有办法在 SELECT 查询本身中动态地使用 MySQL 查询中的窗口函数 我知道在 PostgreSQL 中这是可能的 例如 下面是 PostgreSQL 中的等效查询 SELECT c server ip c client ip s
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • 软删除最佳实践(PHP/MySQL)

    Problem 在处理产品和订单的 Web 应用程序中 我想维护前员工 用户 与他们处理的订单之间的信息和关系 我想维护过时产品和包含这些产品的订单之间的信息和关系 然而 我希望员工能够整理管理界面 例如删除前员工 过时的产品 过时的产品组
  • MySQL 将表的校验和存储在另一个表中

    语境 我们有包含大量表的大型数据库 他们中的大多数 99 都使用innodb 我们希望有一个日常流程来监视哪个表已被修改 当他们使用 innodb 的值时Update time from SHOW table STATUS from inf
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii

随机推荐

  • 如何获取视图html并返回客户端

    下面是返回视图到 jquery 函数的代码片段 但我想知道如何提取或获取视图 html 并返回到客户端 function myddl change function var url this data url var value this
  • 是否有 C# 相当于 Java ConcurrentHashMap

    我需要 C 中的字典 哈希图 允许您执行以下操作 无需锁定即可同时输入值和迭代 锁只放 get没有被锁定 可能会同时get很多次 Thanks 在这里查看 ConcurrentDictionary http msdn microsoft c
  • android操作系统可以捕获蓝牙鼠标右键单击和滚轮事件吗?

    我有一部 android 2 3 5 手机 它可以连接到蓝牙鼠标 但我发现它只响应左键单击和鼠标移动 if event getAction MotionEvent ACTION DOWN Left Button else if event
  • Cordova/PhoneGap无法添加WP7/WP8/Windows平台

    我在 Win8 上尝试添加 wp8 平台时遇到错误 详细信息如下 CordovaWP8 gt cordova d 平台添加 wp8 wp8 的科尔多瓦库已经存在 无需下载 继续 检查平台 wp8 是否通过最低要求 检查 wp8 要求 运行
  • Visual Studio 2015 Intellisense 键盘选项

    首先 我是在这里问这个问题 而不是在 Microsoft 论坛上 因为它们是 嗯 你知道它们是什么 我喜欢 VS2015 Intellisense 自动完成功能 当我需要它们时 但他们愚蠢地添加了空格键作为选择键 更愚蠢的是 他们还添加了
  • 获取WPML的语言代码

    我正在尝试获取 WPLM wordpress 插件的语言代码 这就是我在没有运气的情况下所做的 p Spanish text p 知道问题出在哪里吗 我检查了一些教程 他们就是这样做的 es En不是有效的语言代码 你只想使用es p Sp
  • 为什么我不能使用引用子类型实例的父类型的引用来调用子类方法?

    我正在学习Java 同时试图理解继承 我无法弄清楚为什么子类 walk 中的重写方法被执行 但其他 xyz 方法却没有被执行 class Person public void walk System out println walking
  • 按欧拉角输入旋转四元数

    我正在编写一段代码来控制 3D 空间中的机械臂 机械臂通过四元数处理旋转 但我希望用户通过改变偏航 俯仰和滚动来控制它 因为人类使用这些更明智 我编写了函数来获取用户想要在每个方向 滚动 俯仰 偏航 旋转手臂的量并输出新的四元数 我将 cu
  • 使用 perl 从远程主机读取文件

    我正在尝试从 ubuntu 机器读取位于同一 LAN 中远程主机 ubuntu 上的 root 目录下的文件 temp txt ssh 和 ftp 已打开 perl 脚本能够连接 并出现一个 OpenSSH 对话框 要求输入密码 然后程序存
  • 使用线程睡眠更新 UI

    我正忙于为 Android 设备制作应用程序 现在我正在测试一些东西 我想改变背景颜色有限次 比如说 5 次 每次背景改变时 我希望它在 2 3 秒后再次改变 如果我使用 Thread 类 它会在 Thread 完成后加载整个模板 您看不到
  • 在后面创建数据模板代码

    我正在尝试创建一个用于显示数据的列表框视图 并且希望它包含一个带有 2 列 产品 ID 和产品条形码 数据模板的列表框 我想使用纯 C 代码创建它 或者如果可能的话通过 xaml 加载它 如果我可以创建一个模板 我就可以将 C 作为某种资源
  • 使用 scipy.io.savemat 保存嵌套列表

    这与我的上一个问题有关 可以找到here 我正在处理类似于我在该链接中描述为markerList 的列表的列表 因此是一个具有三个级别的列表 我需要将此信息保存为 mat 文件 但无法将其保存为正确的类型 当使用 scipy io save
  • 带分隔线的进度条

    有人可以向我解释如何实现带有分隔线的进度条 如下图所示吗 对于我正在使用的进度条https github com akexorcist Android RoundCornerProgressBar但这似乎没有分隔符选项 replace Pr
  • Spring Boot 和 JUnit 5 之间的交互——必须使用整体工件而不是个体?

    这个问题之前已经被问过 例如here 但我的观察与之前报道的不一样 我注意到要让 JUnit 5 工作 我必须包含整个 JUnit 5 工件 testImplementation org junit jupiter junit jupite
  • 我应该使用什么正则表达式根据 2 个单词格式和空格分割字符串?

    我正在尝试分割字符串 Chan 0 2 50 0 12 13 92 83 46 Chan 1 2 58 85 92 2 47 9 03 Chan 2 5 00 85 0 33 33 6 64 Chan 3 0 00 0 00 14 41 8
  • 如何获取已删除分区中索引节点在块设备中的偏移量

    在全新安装过程中 我不小心格式化了包含数据的磁盘 我尝试过使用一些工具 最重要的是testdisk 但我没有得到好的结果 看我不成功的帖子在超级用户上 所以我决定阅读一些有关的文档ext2 文件系统结构 我可以获得一些结果 删除的分区有一个
  • 为什么 Emoji 无法在 UITextField 中正确显示?

    当使用以下代码设置表情符号字符时 self textField text ue415 它只是显示为正方形 但是当我从键盘输入表情符号时 它会正确显示 有什么问题 PS 我使用的是IOS 5 1 在旧版本的 iOS 中 表情符号字符全部位于
  • 需要使用正则表达式屏蔽手机号码

    我使用了以下表达方式 replaceAll d d 4 X 在android studio中进行以下操作 Input 1234567809 Expected Output 12XXXXX809 使用上述表达式后得到的输出 XXXXXX780
  • 只能将 str (不是“字节”)连接到 str

    import socket import os user url input Enter url host name user url split 2 mysock socket socket socket AF INET socket S
  • MySQL:仅返回平面/对话消息表中的最后一条消息

    我正在编写一个消息系统 例如 Facebook 的新消息系统 其中两个用户之间的整个来回被视为一次对话 与传统电子邮件相反 传统电子邮件中的每个回复都是单独的消息 或者与 gMail 的对话相反 在 gMail 对话中 回复全部集中在一个对