[ MySQL ] Join을 통해 연관 관계가 Null 인 데이터를 조회하는 방법

5tr1ker·2024년 8월 3일
0

Database

목록 보기
6/7
post-thumbnail

개요

쿠폰 1 : N 다운로드 된 쿠폰 N : 1 유저 다음과 같은 상황에서 유저가 다운로드하지 않은 쿠폰을 모두 가져와야 하는 쿼리를 작성해야합니다.
보통 Null 이 아닌 쿼리를 가져오는데 해당 포스팅에서는 쿼리를 작성해보고자 합니다.

일반적인 상황에서는 leftJoin 만 사용하면 되지만 다운로드된 쿠폰이 Null 인 경우에 유저 엔티티를 조인하는 방법을 다뤄보고자 합니다.

올바르지 않는 쿼리

jpaQueryFactory.select(coupon)
                .from(coupon)
                .innerJoin(coupon.market, market).on(market.marketId.eq(marketId))
                .leftJoin(coupon.downloadCoupons, downloadCoupon)
                .innerJoin(downloadCoupon.account, account).on(account.email.eq(email))
                .where(downloadCoupon.isNull())
                .fetch();
  • leftJoin과 innerJoin 혼합 사용시 주의 사항:

    leftJoin을 사용하면 downloadCoupon이 null일 수 있는 경우를 포함합니다. 그러나 이후에 innerJoin을 사용하면, 조인 조건에 따라 downloadCoupon이 null인 경우가 제외될 수 있습니다. 즉, innerJoin이 downloadCoupon이 존재해야만 하는 조건을 강제합니다. 따라서 leftJoin 하나만으로 On 절을 사용하여 유저 연관관계를 구분하여 가져와야 합니다.

    downloadCoupon이 null인 coupon을 가져오려면 leftJoin만 사용하여, downloadCoupon이 존재하지 않는 coupon만을 필터링하는 쿼리를 작성해야 합니다. innerJoin을 제거하고 leftJoin만 사용하면, downloadCoupon이 없는 경우에도 coupon이 결과에 포함됩니다.

    올바른 쿼리

jpaQueryFactory.select(coupon)
                .from(coupon)
                .innerJoin(coupon.market, market).on(market.marketId.eq(marketId))
                .leftJoin(coupon.downloadCoupons, downloadCoupon).on(downloadCoupon.account.email.eq(email))
                .where(downloadCoupon.isNull())
                .fetch();
profile
https://github.com/5tr1ker

0개의 댓글