Sequelize 聊天列表group查询

发布于 2022-09-12 04:13:52 字数 839 浏览 28 评论 0

做了聊天室的功能
表是这样设计的

id: { type: UUID, primaryKey: true, defaultValue: UUIDV1 },
fromUserId: { type: UUID, allowNull: false },
toUserId: { type: UUID, allowNull: false },
message: { type: STRING, allowNull: false },
isReaded: { type: BOOLEAN, allowNull: false, defaultValue: false },
createdAt: DATE,
updatedAt: DATE,
 deletedAt: DATE

然后我要查当前用户的所有聊天者,就是微信的聊天列表

我是这样写的

const datas = await ctx.model.Chat.findAndCountAll({
        where:{
            [ctx.model.Sequelize.Op.or]:[
                { toUserId: ctx.user.id},
                { fromUserId: ctx.user.id}
            ]
        },
        group: ['toUserId', 'fromUserId'],
    })

然后有会发现,跟一个用户会有两个聊天框,一个是他发我最后一条信息,和我发给他的最后一条信息:

image

我要怎么合并这两个呢?根据最后的发表时间

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

写下不归期 2022-09-19 04:13:52

Sequelize语法不清楚,但可以分享下需求对应的SQL,看是否对你有帮助。(注:sql中的@uid替换为要查询哪个用户的聊天列表的user id)
1.第一种,比较简单

select DISTINCT(if(fromUserId=`@uid`,toUserId,fromUserId)) uid,max(id) 
from chat 
where fromUserId=`@uid` or toUserId=`@uid` group by uid;

但如果聊天表chat数据量越来越大,可能会执行比较久。
主要聚合的是uid,并且要取到对方的uid,所以使用了if(发送方是自己,选择接收方id,否则选择发送方id);最后max查出最后一条的id(正常就是最后发送的时间)。
有了用户的uid和聊天表的id,那剩下的就是去关联用户表和聊天表,取出对应用户信息和聊天信息了。

2.第二种,速度比较快,有点复杂

select uid,max(max_id) as id from (
 select toUserId as uid,max(id) as max_id from chat where fromUserId=`@uid` group by toUserId
 union all
 select fromUserId as uid,max(id) as max_id from chat where toUserId=`@uid` group by fromUserId
)t group by uid
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文