如何为只有一个地址作为参数的聊天应用程序组创建查询?

How to create query for chat app groups with only one address as a parameter?

大家好,我目前正在努力编写 mysql 查询,该查询应该从消息中创建聊天组。我正在制作的应用程序正在从其他服务获取数据,因此我不能同时管理聊天组,我需要从消息本身获取此信息。

我的 table 条消息如下所示:

id 发送地址 接收地址 lastMessage 文本 阅读
1 Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF 2021-06-0212:57:39 测试3 0
5 Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF 2021-06-0213:00:44 测试3 0
7 CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF Ccbbd6uUZF2GD5wE5LEfjGPA3YWPjoLC6P 2021-06-10 23:13:59 测试VPS 0
8 CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF CYfMNQ62u1qwhCBqXzcmeJ8D9j4Yc1Pwef 2021-06-10 20:03:59 neco 0
9 CYfMNQ62u1qwhCBqXzcmeJ8D9j4Yc1Pwef CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF 2021-06-10 21:03:59 测试 0

我从我的移动应用程序发送的唯一输入数据是 receiveAddr 所以我需要添加这个来分组任何包含 sentAddrreceiveAddr 中的地址的内容,这里是表示我想要实现的目标

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

它需要在 read 列中有最新的 text 计数数量 0 和 lastMessage 这是最后一条消息的时间

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

SELECT sentAddr, COUNT(IF(campus.messages.read = 0, 1, NULL)) as unread, max(receiveTime) as lastMessage, max(text) as text FROM campus.messages WHERE (SELECT max(receiveTime) FROM campus.messages) AND receiveAddr = 'CMKovgETx2oYxhoYKAeSakmipBjbmQ9ZHF' GROUP BY sentAddr, receiveAddr

但遗憾的是,这并没有让我收到最新消息的文本,甚至没有考虑到如果同一用户发送一些消息,它会显示为不同的组,这并不是很有帮助。我还想出了一些方法,无论是在发送方还是接收方,都将 sendAddr 和 receiveAddr 归为一组:

GROUP BY CONCAT(LEAST(receiveAddr,sentAddr),' ', GREATEST(receiveAddr, sentAddr))

但是在那种情况下我不能将这个添加到上层查询,它不会检索最新的文本,这是无用的。那么有没有可能通过一个查询来做到这一点,无论它有多长和复杂?提醒一下,只有输入数据是用户的地址,可以是来自table的发送地址或接收地址。那么有什么解决办法吗?

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