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;