我有一个 MySQL 数据库和一个使用该数据库的 Nestjs API。在数据库上,有两个主要表
users
和reservations
。它们具有 OneToMany 关系,即每个预订与一个用户相关联,并且每个用户可以有多个预订。
我想创建一个列出所有用户的查询,并为每个用户返回下一个最近的预订。我想出了这个 SQL 查询:
SELECT *
FROM users u
LEFT JOIN reservations r
ON u.id = r.user_id
AND r.start_date = (
SELECT MIN(start_date) FROM reservations r2
WHERE r2.user_id = r.user_id
AND r2.start_date >= CURRENT_TIMESTAMP()
AND r2.status = 'OPEN'
);
如何将此查询转换为 TypeORM 查询?
您可以通过查询生成器与子查询相结合来实现此目的,如下所示:
UserEntity.getRepository()
.createQueryBuilder('user')
.leftJoinAndSelect('user.reservations', 'reservation')
.where(qb => {
const sub = qb
.subQuery()
.select('MIN(start_date)')
.from('reservations', 'r2')
.where('r2.user_id = r.user_id')
.andWhere('r2.start_date >= CURRENT_TIMESTAMP()')
.andWhere('r2.status = :status', { status: 'OPEN' })
.getQuery();
return `r2.start_date = (${sub})`;
});
请参阅 Typeorm 文档,了解如何使用查询生成器进行选择:https://typeorm.io/select-query-builder