mysql - MySQL获取按日期排序的唯一对话和最后一条消息
问题描述
我正在制作一个消息传递系统。我想检索特定用户的对话内容(该用户既可以是发送者也可以是接收者)按日期排序。我在网上查找了每个问题,但没有一个按预期工作。这是示例表数据。
+-----+---------+-------+---------+------------+
| id |from_user|to_user| content | msg_date |
+-----+---------+-------+---------+------------+
| 1 | 5 | 2 | test1 | 2019-12-01 |
| 2 | 2 | 5 | test2 | 2019-12-02 |
| 3 | 2 | 7 | test3 | 2019-12-03 |
| 4 | 2 | 7 | test4 | 2019-12-04 |
| 5 | 5 | 2 | test5 | 2019-12-05 |
| 6 | 7 | 2 | test6 | 2019-12-06 |
| 7 | 7 | 2 | test7 | 2019-12-07 |
| 8 | 5 | 2 | test8 | 2019-12-08 |
+-----+---------+-------+---------+------------+
这就是我所期望的。(假设特定用户 id 为 2)
+-----+---------+-------+---------+------------+
| id |from_user|to_user| content | msg_date |
+-----+---------+-------+---------+------------+
| 7 | 2 | 7 | test7 | 2019-12-07 |
| 8 | 5 | 2 | test8 | 2019-12-08 |
+-----+---------+-------+---------+------------+
谢谢
解决方案
您可以使用相关子查询进行过滤,该子查询提取每个对话的最新消息的日期:
select t.*
from mytable t
where
2 in (from_user, to_user)
and t.msg_date = (
select max(t1.msg_date)
from mytable t1
where
least(t1.from_user, t1.to_user) = least(t.from_user, t.to_user)
and greatest(t1.from_user, t1.to_user) = greatest(t.from_user, t.to_user)
)
编号 | 来自用户 | to_user | 内容 | msg_date -: | --------: | ------: | :-------- | :--------- 7 | 7 | 2 | 测试7 | 2019-12-07 8 | 5 | 2 | 测试8 | 2019-12-08
推荐阅读
- python - 检查python是否删除文件夹成功,如果是,继续
- reactjs - 我们如何在css文件中导入js文件变量
- java - 如何让方法返回一个面板?
- angular - 为什么请求正文中的所有值都为空?
- c# - 从coldfusion验证在c#中加密的密码
- angular - Angular8无法在promise中读取属性'once' of undefined'
- jwt - 带有 keycloak 的最小 jwt 令牌有效负载
- java - 如何在单击列表视图项目时出现勾选并且在单击下一个项目之前不会消失也不会在转到另一个活动时消失
- angular - 在 Angular NGXS 中将数据附加到状态
- amazon-web-services - 如何在 Cloudformation 中为 beanstalk 引用 Option_settings