Javascript 将重复的mysql结果分组到同一结果下
我正在开发一个聊天系统,它有一个我无法修改的现有数据库结构 我正在尝试获取特定用户脱机时收到的消息(假设该用户就是我) 目前,我的查询为我提供以下结果:Javascript 将重复的mysql结果分组到同一结果下,javascript,mysql,sql,Javascript,Mysql,Sql,我正在开发一个聊天系统,它有一个我无法修改的现有数据库结构 我正在尝试获取特定用户脱机时收到的消息(假设该用户就是我) 目前,我的查询为我提供以下结果: [ { username: 'Chico', message: 'chicoMessage1', sentBy: 23 }, { username: 'rep', message: 'repMessage1', sentBy: 59 }, { username: 'Chico', message:
[ { username: 'Chico',
message: 'chicoMessage1',
sentBy: 23 },
{ username: 'rep',
message: 'repMessage1',
sentBy: 59 },
{ username: 'Chico',
message: 'chicoMessage2',
sentBy: 23 },
{ username: 'rep',
message: 'repMessage2',
sentBy: 59 } ]
上述结果意味着用户“Chico”向我发送了2条消息,用户“rep”也向我发送了2条消息。我们可以看到消息的内容,以及消息发送者的ID
我希望得到的最终结果是,将每个用户名的上述内容分组在同一个用户名下,这样我才能有效地使用它
因此,基本上这样做会很好:
[ { username: 'Chico',
messages: ['chicoMessage1', 'chicoMessage1' ],
sentBy: 23 },
{ username: 'rep',
messages: ['repMessage1', 'repMessage2' ],
sentBy: 59 } ]
我可以用MySQL做这个吗?下面是我现在的查询(结果是前面提到的结果):
这些表如下所示:
tusers
id |用户名|密码
消息
messageID | message | sentBy
离线对话
userID | messageID
MySQL能实现我想要的吗?如果没有,你会怎么做(在JS中)
感谢您使用GROUP_CONCAT函数和GROUP BY子句:
我在
messages
表中还有一个“createdAt”时间戳列,我如何使用它来从最新到最旧排序消息?使用GROUP_CONCAT(messages.message order BY createdAt DESC)
太棒了,谢谢!我添加了分隔符“---”,然后通过JS使用该分隔符拆分字符串以创建一个消息数组。有没有更好的方法直接从MySQL中获取该阵列?感谢如果此查询速度较慢,请尝试使用索引对其进行优化。首先对查询运行explain extended
命令,并保存其结果以供进一步比较。然后尝试在messageId
上创建索引(如果它还不是主键),在createdAt
上,在messageId+createdAt
上创建多列索引也值得一试。创建每个索引并比较结果后再次运行解释,并在每个步骤后测试查询速度。你也可以问一个关于优化这个查询的新问题。非常感谢,你是最棒的!
SELECT tusers.username, messages.message, messages.sentBy
FROM messages
JOIN offlineconversations
ON messages.messageID = offlineconversations.messageID
JOIN tusers
ON tusers.id = messages.sentBy \
WHERE offlineconversations.userID = 100;
SELECT tusers.username, messages.sentBy,
GROUP_CONCAT( messages.message ) As messages
FROM messages
JOIN offlineconversations
ON messages.messageID = offlineconversations.messageID
JOIN tusers
ON tusers.id = messages.sentBy
WHERE offlineconversations.userID = 100
GROUP BY tusers.username, messages.sentBy;