하나의 상품에 대해 여러개의 판매입찰이 있을때 가장 낮은 가격의 상품 하나만 띄우고 싶을때

keep_going·2023년 4월 26일
0

문제해결

목록 보기
15/36
  • 문제
    하나의 product id에 대해서 여러개의 다른 상품 판매입찰 가능
    size, wish price, inventory div, expiry date, regist date가 일부분은 같고 일부분은 다를 수 있는데..
    화면에 썸네일로 띄울때는 같은 상품으로 보여야 한다는점
	@Query(value="SELECT "
	          + "new com.example.ballis.DTO.ProductNewDTO(prod.id, prod.productEngName, prod.dataStatus, prod.launchingDate, "
	          + "img.imagePath, img.mainImageDiv, bd.brandName, sel.wishPrice, sel.inventoryDiv) "
	            + "FROM Product prod "
	            + "INNER JOIN Image img ON prod.id = img.targetId "
	            + "INNER JOIN Brand bd ON prod.brand = bd.brandId "
	            + "INNER JOIN Selling sel ON prod.id = sel.product "
	            + "WHERE img.pageDiv = 1 AND img.mainImageDiv = 1 "
	            + "ORDER BY prod.launchingDate DESC",
	            nativeQuery = false)

지금 이렇게 쓴 jpql의 쿼리로는 .. product id에 대해 group by 하지 않았기 때문에 같은 상품의 다른 가격, 다른 사이즈 등에 대해서 각각 다른 상품으로 인식하고 출력함.
그럼 group by로 product id에 대해서 묶으면? 그럼 각각 다른 정보를 가진 selling 테이블의 값들이 무시됨
결국 쿼리로 묶을수 없고 product id가 같은걸 이용해서 selling 테이블을 조회하는 방법 뿐?
지금 쿼리에서 이미지와 브랜드는 프로덕트랑 묶을수 있음. 유저 입력에 의해 바뀌지 않고 관리자가 상품을 등록할때 정해진것이므로...

상품목록을 띄울때 각 상품id를 fk로 가지는 selling 테이블의 데이터들(빠른배송여부, 판매가격, 즉시구매여부)를 띄워야함

findById로 하면 특정 id값들을 넣어줘야하는거아닌가?
상품 목록을 띄우고 (특정 order by 기준에 따라) 그때의 id 값을 받아온다..? 그리고 그 값을 findById로 selling 테이블의 데이터를 찾는다?

  • 해결
    서브쿼리 써서 해결함
	@Query(value="SELECT "
	          + "new com.example.ballis.DTO.ProductNewDTO"
	          + "(prod.id, prod.productEngName, img.imagePath, bd.brandName, "
	          + "sel.wishPrice, sel.inventoryDiv) "
	            + "FROM Product prod "
	            + "INNER JOIN Image img ON prod.id = img.targetId "
	            + "INNER JOIN Brand bd ON prod.brand = bd.brandId "
	            + "INNER JOIN Selling sel ON prod.id = sel.product "
	            + "WHERE img.pageDiv = 1 AND img.mainImageDiv = 1 AND prod.dataStatus = 1 "
	            + "AND sel.wishPrice = ("
	            + "SELECT MIN(wishPrice) "
	            + "FROM Selling "
	            + "WHERE product = prod.id) "
	            + "ORDER BY prod.launchingDate DESC",
	            nativeQuery = false)

서브쿼리를 쓰니 selling 테이블에서 원하는 데이터(가장 낮은 가격)를 가진 행의 전체를 가져올수 있었음
group by로는 불가능!

profile
keep going

0개의 댓글