kakasoo

4. WHERE과 subQuery, COUNT를 조건으로 걸기 본문

프로그래밍/TypeORM

4. WHERE과 subQuery, COUNT를 조건으로 걸기

카카수(kakasoo) 2023. 1. 10. 23:55
반응형
const users = await this
  .createQueryBuilder('user')
  .withDeleted()
  .where('user.id = :userId', { userId })
  .andWhere((qb) => {
    // 지금까지 결제한 횟수를 알기 위해 OrderInfo 라는 Entity를 카운트한다.
    const subQuery = qb
      .subQuery()
      .select('COUNT(*)')
      .from(OrderInfoEntity, 'oi') 
      .where('oi.userId = :userId', { userId })
      .getQuery();

    return `${subQuery} <= 2`;
  })
  .getMany();

 

where문에는 파라미터로 문자열을 받을 수도 있지만, 서브쿼리를 파라미터로 하는 함수를 받을 수도 있다.

이 때 내부 파라미터로 받은 함수는 다시 문자열을 반환해야 한다.

문자열이든, 문자열을 반환하는 함수든, 결국 그 문자열은 조건을 의미해야 하며,

서브쿼리를 받을 경우 위 코드와 같이 subQuery() 로 시작해서 getQuery() 로 끝나는 서브 쿼리문을 쓴다.

이 서브 쿼리를 이용해서 위와 같이, 특정 숫자보다 작은 경우를 잡을 수도 있다.

 

select, addSelect의 경우에는 subQuery()도 없고 문자열이 아니라 SelectQueryBuilder를 리턴해야 한다.

하지만 where ,andWhere은 문자열을 받기 때문에 subQuery(), getQuery()를 가지는 게 차이점이다.

반응형