如何使用Sequelize实现左连接查询用户未浏览的帖子
Sequelize 实现用户未浏览帖子查询方案
你现有的多对多关联配置不需要调整,直接通过Sequelize的关联查询参数即可1:1复现你写的原生SQL逻辑,代码如下:
// 替换成你要查询的目标用户ID const targetUserId = 123; const unreadPosts = await Post.findAll({ include: [ { model: User, attributes: [], // 不返回关联用户表的冗余字段 through: { attributes: [], // 不返回中间表的冗余字段 where: { userId: targetUserId } }, required: false // 强制生成LEFT JOIN,而非默认的INNER JOIN } ], where: { '$User.id$': null // 筛选左连接后无匹配浏览记录的帖子 } });
关键参数说明
required: false:是实现左外连接的核心配置,会让Sequelize保留Post表所有记录,哪怕没有匹配到关联的User浏览记录,和你原生SQL的LEFT JOIN逻辑一致- 用户ID过滤条件写在
include.through.where下:该位置的条件会被拼接到JOIN的ON子句中,对应你原生SQL里upv.userId = ${user_id}的部分,注意不要把这个条件写到外层where里,否则会把左连接变成等价内连接,查询结果出错 - 外层
where条件用$User.id$判空:对应原生SQL里upv.postId IS NULL的逻辑,筛选出没有对应浏览记录的帖子,就是指定用户未浏览过的内容
可选优化建议
- 可以给中间表
User_Post_Visit的(userId, postId)字段添加联合唯一索引,既能避免同一个用户同一条帖子生成重复浏览记录,也能大幅提升这类关联查询的性能 - 如果后续需要给浏览记录扩展字段(比如浏览时间、停留时长、浏览设备),可以为中间表单独定义Sequelize模型,替换掉关联配置里的字符串表名即可,上述查询逻辑不需要改动
内容的提问来源于stack exchange,提问作者Quentin Gibson
相关产品推荐
相关产品推荐

