如何为只有一个地址作为参数的聊天应用程序组创建查询?
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
所以我需要添加这个来分组任何包含 sentAddr
或 receiveAddr
中的地址的内容,这里是表示我想要实现的目标
用户
其他参与者
未读
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
大家好,我目前正在努力编写 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
所以我需要添加这个来分组任何包含 sentAddr
或 receiveAddr
中的地址的内容,这里是表示我想要实现的目标
用户 | 其他参与者 | 未读 | 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