如何在Sequelize关联查询中排除无数据分类并设置返回行数下限
解决方法
要排除无视频的分类,或是设置关联视频的最小数量,你可以通过以下两种方案实现:
方案一:强制内连接过滤无视频分类
你之前在video的include里配置required未生效,是因为需要在嵌套的video关联层级正确设置该属性,让category和video之间使用内连接,仅保留存在关联视频的分类。若主模型仅需关联符合条件的分类,还需给category的include也添加required: true。
修改后的代码示例:
include: [ { model: models.category, include: [ { model: models.video, required: true // 强制category与video做内连接,无视频的分类直接被排除 } ], // 若主模型仅需保留关联了有视频分类的记录,添加此行 // required: true } ]
方案二:聚合函数筛选(支持设置最小视频数量)
如果需要指定分类下视频的最小行数(比如至少2个),可以用COUNT聚合函数配合group和having子句实现:
include: [ { model: models.category, include: [ { model: models.video, attributes: [] // 不需要返回视频详情时可设为空,仅用于统计 } ], attributes: { // 新增视频数量统计字段 include: [[models.sequelize.fn('COUNT', models.sequelize.col('videos.id')), 'videoCount']] }, group: ['category.id'], // 按分类ID分组 having: models.sequelize.where( models.sequelize.fn('COUNT', models.sequelize.col('videos.id')), '>=', 1 // 这里设置最小视频数量,比如1就是至少1个视频 ) } ]
注意:如果需要返回视频的具体数据,不要将
video的attributes设为空,同时group子句需包含视频表的所有字段(或开启Sequelize的subQuery: false),避免分组报错。
内容的提问来源于stack exchange,提问作者Charles Pettis
相关产品推荐
相关产品推荐

