mysql - 如何为只有一个地址作为参数的聊天应用组创建查询?
问题描述
大家好,我目前正在努力编写 mysql 查询,该查询应该从消息中创建聊天组。我正在制作的应用程序正在从其他服务中获取数据,因此我不能同时管理聊天组,我需要从消息本身中获取这些信息。
我的消息表如下所示:
ID | 发送地址 | 接收地址 | 最后一条消息 | 文本 | 读 |
---|---|---|---|---|---|
1 | Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P | CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | 2021-06-02 12:57:39 | 测试3 | 0 |
5 | Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P | CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | 2021-06-02 13:00:44 | 测试3 | 0 |
7 | CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P | 2021-06-10 23:13:59 | 测试VPS | 0 |
8 | CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | CYfMNQ62u1qwhCBqXzcmeJ8D9j4Yc1Pwef | 2021-06-10 20:03:59 | 内科 | 0 |
9 | CYfMNQ62u1qwhCBqXzcmeJ8D9j4Yc1Pwef | CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | 2021-06-10 21:03:59 | 测试 | 0 |
我从我的移动应用程序发送的唯一输入数据是receiveAddr
,所以我需要将其添加到任何包含地址的任何内容sentAddr
或receiveAddr
中,这是我想要实现的表示
用户 | 其他参与者 | 未读 | 最后一条消息 | 文本 |
---|---|---|---|---|
CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P | 5 | 2021-06-10 23:13:59 | 测试VPS |
CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF | CYfMNQ62u1qwhCBqXzcmeJ8D9j4Yc1Pwef | 1 | 2021-06-10 21:03:59 | 测试 |
它需要在列中具有最新text
计数的 0并且是最后一条消息的时间read
lastMessage
如果移动应用程序的用户只是接收消息,我想出了一些可行的方法,那就是:
SELECT sentAddr, COUNT(IF(campus.messages.read = 0, 1, NULL)) 作为未读,max(receiveTime) 作为 lastMessage,max(text) 作为文本 FROM Campus.messages WHERE (SELECT max(receiveTime) FROM Campus。消息) AND receiveAddr = 'CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF' GROUP BY sentAddr, receiveAddr
但遗憾的是,这并没有让我从最新消息中获得文本,甚至没有考虑到如果同一个用户发送一些消息,它会显示为不同的组,这并没有真正的帮助。我还想出了将 sendAddr 和 receiveAddr 分组为一组的东西,无论它是在发送端还是接收端:
GROUP BY CONCAT(LEAST(receiveAddr,sentAddr),' ', GREATEST(receiveAddr, sentAddr))
但是在那种情况下,我不能将此添加到上层查询中,它不会检索最新的文本,这是无用的。那么有没有机会用一个查询来做到这一点,不管它有多长和多复杂?提醒一下,只有输入数据是用户的地址,可以是表中的发送地址或接收地址。那么有什么解决方案吗?
mysql数据库的版本是8.0.25
解决方案
我想通了,这里是:
SELECT myMessages.user, myMessages.otherParticipant, groupList.unread,
groupList.lastMessage, myMessages.text FROM (SELECT IF(sentAddr = ?,
sentAddr, receiveAddr) as user, IF(receiveAddr = ?, sentAddr,
receiveAddr) as otherParticipant, receiveTime, campus.messages.text,
campus.messages.read FROM campus.messages) myMessages INNER JOIN (SELECT
otherParticipant, COUNT(IF(myMessages2.read = 0, 1, NULL)) as unread,
max(receiveTime) as lastMessage FROM (SELECT IF(receiveAddr = ?,
sentAddr, receiveAddr) as otherParticipant, receiveTime,
campus.messages.read FROM campus.messages WHERE sentAddr = ? or receiveAddr = ?) as myMessages2 GROUP BY
otherParticipant) groupList ON myMessages.otherParticipant =
groupList.otherParticipant AND myMessages.receiveTime =
groupList.lastMessage
推荐阅读
- angularjs - 使用承诺而不是延迟?
- docker - Dockerfile LDAP 更新未保存
- ruby-on-rails - perform_async Sidekiq 问题
- javascript - 如何使用reduce,使用解构和递归检查数组是否相等?
- vim - vim:如何删除行中间的空格
- aws-lambda - 使用 AWS Cognito JWT 令牌进行身份验证时,我是否需要 API Gateway 中的自定义授权方?
- components - 如何通过角度 6 中的单击事件将值获取到组件文件中
- reactjs - 对于由 create-react-app 引导的项目,将测试放在 src 文件夹中的合法性
- ruby-on-rails - Bootstrap-rubygem 与 twitter-bootstrap-rails gem
- google-api-java-client - 服务帐号和 Google Play 开发者 API