首页 > 解决方案 > 如何为只有一个地址作为参数的聊天应用组创建查询?

问题描述

大家好,我目前正在努力编写 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,所以我需要将其添加到任何包含地址的任何内容sentAddrreceiveAddr中,这是我想要实现的表示

用户 其他参与者 未读 最后一条消息 文本
CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P 5 2021-06-10 23:13:59 测试VPS
CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF CYfMNQ62u1qwhCBqXzcmeJ8D9j4Yc1Pwef 1 2021-06-10 21:03:59 测试

它需要在列中具有最新text计数的 0并且是最后一条消息的时间readlastMessage

如果移动应用程序的用户只是接收消息,我想出了一些可行的方法,那就是:

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

标签: mysqldatabasejoingroup-bychat

解决方案


我想通了,这里是:

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

推荐阅读