내가 가진 카드의 카드 혜택이 있는 가맹점 찾기
- 내가 가진 카드 테이블에서 카드를 찾아
- 그 카드가 가진 카드 혜택들을 조회
- 카드 혜택에 shopName이 있으면
- 카드 혜택에 shopName이 없으면
- category를 찾아
- 가맹점 테이블에
- 해당 category를 가지고 있는 모든 가맹점에 대해
SELECT distinct COALESCE(b.shop_name, s.name)
FROM card_benefit b
JOIN user_card u ON b.card_name = u.card_name
LEFT JOIN shop s ON b.category = s.category
WHERE
(u.user_id="test1234")
AND
(
(b.shop_name IS NOT NULL)
OR
(b.shop_name IS NULL AND s.category IS NOT NULL)
);
@Override
public List<String> findAllShopNameByUserId(String userId) {
QCardBenefit cardBenefit=QCardBenefit.cardBenefit;
QUserCard userCard=QUserCard.userCard;
QShop shop=QShop.shop;
return queryFactory
.selectDistinct(cardBenefit.shopName.coalesce(shop.name))
.from(cardBenefit)
.innerJoin(userCard)
.on(cardBenefit.card.name.eq(userCard.card.name))
.leftJoin(shop)
.on(cardBenefit.category.eq(shop.category))
.where(
userCard.user.id.eq(userId)
~~.and(
cardBenefit.shopName.isNotNull()
.or(
cardBenefit.shopName.isNull()
.and(shop.category.isNotNull())
)
)~~
)
.fetch();
}