如何用Sequelize基于ID关联BookReaders与MovieWatchers表查询数据?
解决Sequelize关联查询Top100活跃用户的问题
你的核心问题是关联MovieWatchers和BookReaders时字段引用语法错误,另外limit参数也存在类型不规范的问题。下面给出几种可行的解决方案:
方案一:利用模型关联(推荐)
先确保两个模型间定义了正确的关联关系,这样查询时无需手动编写关联条件。
假设BookReaders.userId对应MovieWatchers.id,在MovieWatchers模型文件中添加关联:
MovieWatchers.belongsTo(BookReaders, { foreignKey: 'id', // 当前模型(MovieWatchers)的关联字段 targetKey: 'userId' // 关联模型(BookReaders)的匹配字段 });
之后查询代码可简化为:
const mostActiveMovieWatchers = await MovieWatchers.findAll({ order: [['moviesWatched', 'DESC']], limit: 100, // 用数字类型,不要用字符串'100' include: [{ model: BookReaders, required: true // 等价于INNER JOIN,仅返回有对应图书档案的用户 }] });
方案二:手动指定关联条件(不依赖模型关联)
如果不想预先定义模型关联,可直接在include的where中明确关联逻辑,注意指定表名避免字段冲突:
写法1:数组形式条件
const mostActiveMovieWatchers = await MovieWatchers.findAll({ order: [['moviesWatched', 'DESC']], limit: 100, include: [{ model: BookReaders, where: ['BookReaders.userId = MovieWatchers.id'], required: true }] });
写法2:使用Sequelize.col引用字段
const { Op } = require('sequelize'); const mostActiveMovieWatchers = await MovieWatchers.findAll({ order: [['moviesWatched', 'DESC']], limit: 100, include: [{ model: BookReaders, where: { userId: { [Op.eq]: Sequelize.col('MovieWatchers.id') } }, required: true }] });
内容的提问来源于stack exchange,提问作者user1855009
相关产品推荐
相关产品推荐

