인기상품 쿼리

keep_going·2023년 5월 2일
0

문제해결

목록 보기
18/36
    @Query(value="SELECT "
			+ "new com.example.ballis.DTO.ProductPopDTO"
			+ "(prod.id, prod.productEngName, MAX(img.imagePath), bd.brandName, sell.wishPrice, sell.inventoryDiv, COUNT(cont.id)) "
			+ "FROM Product prod "
            + "INNER JOIN Image img ON prod.id = img.targetId "
            + "INNER JOIN Brand bd ON prod.brand = bd.brandId "
            + "INNER JOIN Selling sell ON prod.id = sell.product "
            + "LEFT JOIN Contract cont ON prod.id = cont.product "
            + "WHERE img.pageDiv = 1 AND img.mainImageDiv = 1 AND sell.sellingStatus = 1 "
            + "AND sell.wishPrice = "
            + "(SELECT MIN(wishPrice) "
            + "FROM Selling "
            + "WHERE product = prod.id) "
            + "AND (sell.inventoryDiv = 1 OR "
            + "(sell.inventoryDiv = 2 AND NOT EXISTS "
            + "(SELECT 1 FROM Selling subSell WHERE prod.id = subSell.product "
            + "AND sell.wishPrice = subSell.wishPrice "
            + "AND subSell.inventoryDiv = 1)))"
            + "GROUP BY prod.id, prod.productEngName, bd.brandName, sell.wishPrice, sell.inventoryDiv "
            + "ORDER BY COUNT(cont.id) DESC",
			nativeQuery = false)
	List<ProductPopDTO> getProductPop();
  • 문제)
    group by를 하려고 하면 계속 오류가 났는데...
    ONLY_FULL_GROUP_BY 모드가 활성화되어 있어서 발생하는 문제

  • 해결)
    썸네일로 띄우는 정보이므로 대표 이미지만 쓴다.
    imagePath는 결국 하나의 값 뿐임. max를 써서 (min도 상관없음)하나의 값만 나오게 하고 나머지를 다 group by로 묶음..

  • 의문)

            + "AND sell.wishPrice = "
            + "(SELECT MIN(wishPrice) "
            + "FROM Selling "
            + "WHERE product = prod.id) "

이부분을 없애고 select에서 그냥 MIN(sell.wishPrice)하면 되지 않나? 생각했는데 그렇게 하면 inventory 값이 다른 동일한 상품에 대해서 다른 데이터로 인식함.

profile
keep going

0개의 댓글