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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:54:05