Sequelize中如何分别排序主模型Chat与关联模型Message
实现方案
要实现Chat按关联消息的最新时间降序排序,同时每个Chat下的messages按时间升序排列,需要把主表排序和关联表排序分开配置,具体修改如下:
方法一:用聚合函数+分组排序
const chats = await Chat.findAll({ where: { userId }, include: { model: Message, as: 'messages', // 单独给关联的messages设置升序排序 order: [['sentDate', 'ASC']] }, // Chat基于关联消息的最新时间降序排列 order: [ [Sequelize.fn('MAX', Sequelize.col('messages.sentDate')), 'DESC'] ], // 聚合函数需要配合分组,这里填Chat的主键字段(比如id) group: ['Chat.id'] });
注意:如果你的Chat模型主键不是id,要替换成实际的主键字段;部分数据库开启ONLY_FULL_GROUP_BY模式后,需要把Chat的所有查询字段都加入group数组,否则会报错。
方法二:用子查询排序(更灵活)
如果不想处理分组的问题,可以用子查询获取每个Chat的最新消息时间,以此作为Chat的排序依据:
const chats = await Chat.findAll({ where: { userId }, include: { model: Message, as: 'messages', // 关联消息单独按时间升序 order: [['sentDate', 'ASC']] }, // 子查询获取当前Chat的最新消息时间,用来排序Chat order: [ [ sequelize.literal(`(SELECT MAX(sentDate) FROM messages WHERE messages.chatId = Chat.id)`), 'DESC' ] ] });
关键逻辑说明
原代码里的order: [['messages', 'sentDate', 'desc']]会同时影响Chat和关联messages的排序,所以必须拆分:
- 关联messages的排序配置在
include内部的order选项中,单独指定升序 - Chat的排序需要基于其关联消息的最新时间来降序,通过聚合函数或子查询实现
内容的提问来源于stack exchange,提问作者Brad K
相关产品推荐
相关产品推荐

