如何使用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
相关产品推荐
相关产品推荐

