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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:20:33