Sequelize对接Postgres时如何查询存在关联视频的视频分类?
首先需要注意:你当前给出的关联配置外键和原生SQL里的外键名称不一致,关联配置里指定的外键是categoryId,但原生SQL关联条件用的是videoCategoryId,需要先将两处的外键名称统一,以下示例默认统一使用categoryId作为外键字段名。
实现方案1:使用关联查询(INNER JOIN)
核心配置是required: true,Sequelize会自动将默认的左连接转为内连接,自动过滤没有关联视频的分类:
const { Sequelize } = require('sequelize'); const categoriesWithVideos = await VideoCategory.findAll({ attributes: [ // 实现DISTINCT去重,避免同一分类下多个视频导致重复返回 [Sequelize.fn('DISTINCT', Sequelize.col('name')), 'name'] ], include: [{ model: Video, required: true, // 关键配置:开启后使用INNER JOIN attributes: [] // 不返回视频表的字段,减少冗余数据 }] });
如果不想用DISTINCT,也可以用分组实现去重,替换上面的attributes配置即可:
attributes: ['name'], group: ['VideoCategory.id', 'VideoCategory.name']
实现方案2:使用EXISTS子查询
数据量较大时性能优于关联查询,写法更简洁:
const categoriesWithVideos = await VideoCategory.findAll({ attributes: ['name'], where: Sequelize.literal(` EXISTS ( SELECT 1 FROM "Videos" WHERE "Videos"."categoryId" = "VideoCategories"."id" ) `) });
以上两种方案都可以实现你给出的原生SQL同等效果。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

