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

如何使用Mikro-ORM基于子查询实现JOIN关联查询?

修正后的完整代码

// 子查询不需要加await,getKnexQuery仅构造查询对象不实际执行
const subQuery = er
  .createQueryBuilder('DirectMessages')
  // 给MAX聚合结果加别名sent_at,和原SQL逻辑对齐
  .select(['sender_id', 'receiver_id', 'MAX(sent_at) AS sent_at'])
  .where({ $or: [{ senderID: '2' }, { senderID: '3' }] })
  .andWhere({ $or: [{ receiverID: '3' }, { receiverID: '2' }] })
  .groupBy(['sender_id', 'receiver_id'])
  .getKnexQuery();

const queryResults = await er
  .createQueryBuilder('DirectMessages', 'T') // 给主表指定别名T,对应原始SQL的表别名
  .select('*')
  .withSubQuery(subQuery, 'A')
  // 修正关联逻辑,补充两个匹配条件
  .innerJoin('A', function() {
    this.on('A.sender_id', '=', 'T.sender_id')
      .andOn('A.sent_at', '=', 'T.sent_at')
  })
  .execute('all', true);

核心修改说明

  • 主查询创建QueryBuilder时给DirectMessages表指定别名T,和你要复现的SQL逻辑对齐
  • 子查询中给MAX(sent_at)添加别名sent_at,保证临时表A有对应字段可以匹配主表的发送时间
  • 调整JOIN写法,同时配置两个关联条件:A.sender_id = T.sender_id和A.sent_at = T.sent_at,完全匹配原始SQL的关联逻辑
  • 去掉子查询前的await,因为getKnexQuery只是构造SQL语句对象,不需要异步执行查询

内容的提问来源于stack exchange,提问作者BigBellyBigDreams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:39:04