You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:45:15