top제품 선정

기여·2024년 8월 23일
0

소소한 개발팁

목록 보기
85/103

index 진입 시 로그인 여부에 상관없이 top제품을 표시하려고 한다.

조건:

  • 주문상태가 '도착'인 제품에 한정
  • 누적 주문량 & 후기건수 순으로 정렬
  • 후기건수 출력(0값 허용)

상품+주문+후기 테이블 3개 단순히 join한 결과 후기건수가 정확히 합산되나
누적 주문량은 2배로 늘어나서 중복제거 위해 이중 select문 사용했다.
distinct도 고려했는데 쿼리가 간결해지지만 권장되진 않았다.

SELECT 
    o.product_code, p.pname, pimgStr, pprice, pdelifee, category, 
    COALESCE(reviewStats.reviewCount, 0) AS reviewCount, 
    totalQuantity
FROM 
    (SELECT 
        o.product_code, 
        SUM(o.pquantity) AS totalQuantity
     FROM 
        ord o
     WHERE 
        o.ostatus = '도착'
     GROUP BY 
        o.product_code
    ) o
JOIN 
    products p ON o.product_code = p.product_code
LEFT JOIN 
    (SELECT 
         r.product_code, 
         COUNT(r.rid) AS reviewCount
     FROM 
         review r
     GROUP BY 
         r.product_code
    ) reviewStats ON o.product_code = reviewStats.product_code
ORDER BY 
    totalQuantity DESC, reviewCount DESC
    LIMIT 4

top제품 4개만 보여드리면 아쉬우니까 카테고리도 출력!

@GetMapping("/index")
	public String index(Model model) {
		System.out.println("templates index + top제품");
		
		//top제품 리스트
		List<PrdVo> li = prdSvc.topPrd();
		model.addAttribute("rcmList", li);
		
		//카테고리 리스트
	    List<PrdVo> ctgrList = prdSvc.ctgrList();
	    model.addAttribute("ctgrList", ctgrList);	  
		
		return "index";
	}

사용자 로그인 성공 시에도 index로 보내기

		    if (authenticated) {	 //사용자 로그인 성공
				session.setAttribute("username", username);
				session.setAttribute("loginType", loginType);
				System.out.println("사용자 로그인 성공: " + username+" / loginType: "+loginType);
				
				return "redirect:/index";			    
			}
profile
기기 좋아하는 여자

0개의 댓글