Sequelize关联查询:筛选关联模型中匹配最高Nonce的记录
解决方案:查询Channel时仅关联对应最高nonce的Transaction
我明白你的需求了——现在你能查出符合条件的Channel及其所有关联Transaction,但需要过滤掉每个Channel里nonce不是最高的那些记录。这里有个直接可行的写法,用Sequelize的literal嵌入子查询来实现:
const channels = await Channel.findAll({ include: [ { model: Transaction, where: { nonce: { [Op.eq]: Sequelize.literal(`(SELECT MAX(nonce) FROM transactions WHERE transactions.channelId = channel.id)`) } } } ], where: { [Op.or]: [{ agentA: address }, { agentB: address }] } });
写法解释:
- 子查询
(SELECT MAX(nonce) FROM transactions WHERE transactions.channelId = channel.id)会针对每个Channel实例,找出它关联的Transaction里的最高nonce值。 - 通过
Op.eq让当前关联的Transaction的nonce等于这个最大值,这样每个Channel就只会返回那条nonce最高的Transaction。
注意事项:
- 确保表名正确:如果你的Transaction模型对应的数据库表不是默认复数形式(比如你手动指定了表名为
transaction),记得把子查询里的transactions替换成实际表名。 - 性能优化:可以给
transactions表的channelId和nonce字段加联合索引,这样子查询的执行效率会更高。
如果需要更优雅的复用方式,你也可以在Channel模型里定义一个专属的关联(比如LatestTransaction):
// 在Channel模型中添加关联 Channel.hasOne(Transaction, { as: 'LatestTransaction', foreignKey: 'channelId', scope: { nonce: Sequelize.literal(`(SELECT MAX(nonce) FROM transactions WHERE transactions.channelId = channel.id)`) } }); // 查询时直接使用这个关联 const channels = await Channel.findAll({ include: ['LatestTransaction'], where: { [Op.or]: [{ agentA: address }, { agentB: address }] } });
这样后续查询时就可以直接复用LatestTransaction关联,代码更整洁。
内容的提问来源于stack exchange,提问作者rhlsthrm
相关产品推荐
相关产品推荐

