如何在Sequelize中按关联表CategoryTopics的数量倒序排序?
按关联表CategoryTopics的数量倒序排序实现方案
你当前的代码直接将关联模型作为排序字段是无效的,因为CategoryTopics是一个关联集合,无法直接用于排序。需要通过聚合函数统计关联记录数量,再基于这个计数进行排序,具体修改方案如下:
关键改动说明
- 使用Sequelize的
fn和col方法生成计数聚合函数 - 在查询属性中添加关联记录的计数字段并指定别名
- 按分类表的主键分组,确保计数准确
- 基于计数字段进行倒序排序
修改后的完整代码
// 引入Sequelize的聚合工具方法(如果未全局引入) const { fn, col } = require('sequelize'); const query = this.query(lang, nested); if (count && nested) { // 保留分类原有属性,同时添加关联Topic的计数字段 query.attributes = { include: [[fn('COUNT', col('CategoryTopics.id')), 'topicCount']] }; query.include = [ { model: this.TopicModel, as: 'CategoryTopics', attributes: [], // 无需返回Topic的具体属性,仅用于计数 required: false, // 可选:设为false则保留无关联Topic的分类(计数为0);设为true仅返回有关联的分类 }, ]; // 按分类表主键分组(假设主键为id,需根据实际表结构调整) query.group = ['Category.id']; // 按关联计数倒序排序 query.order = [['topicCount', 'DESC']]; } const categories = (await this.CategoryModel.findAll(query)).map((el) => el.get({ plain: true }), );
补充说明
- 如果你的分类表主键不是
id,需要将group中的Category.id替换为实际主键字段名 - 返回的每个分类对象中会新增
topicCount字段,对应该分类关联的Topic数量 required: false会使用LEFT JOIN语法,确保没有关联Topic的分类也能被查询到;如果只需要保留有Topic的分类,将其设为true即可
内容的提问来源于stack exchange,提问作者user892134
相关产品推荐
相关产品推荐

