보라코딩

스프링부트 맛집별 별점구현 (Join, SQL문) 본문

코딩/Spring

스프링부트 맛집별 별점구현 (Join, SQL문)

new 보라 2023. 5. 25. 13:56

 

 

StoreVO

 

package com.tastemate.domain;

import lombok.Data;
import org.apache.ibatis.type.Alias;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Data
@Alias("StoreVO")
public class StoreVO {

private String storeIdx;
private String userIdx;
private String storeName;
private String category1;
private String storeAddress;

private double storeLati;
private double storeLongi;

private String phoneNumber;
private String storeCount;

private String filename;
private MultipartFile oriFilename;


// join
private List<MenuVO> menuVO;

// join
private StarVO starVO;


}

 

 

 

 

 

StarVO

 

별점 구현을 위해 starVO 테이블을 만들었다.

맛집 하나당 별점은 여러개이기에!

package com.tastemate.domain;

import lombok.Data;
import org.apache.ibatis.type.Alias;

@Data
@Alias("StarVO")
public class StarVO {

private int starIdx;
private int storeIdx;
private int userIdx;
private double storeStar;
private int userStar;

private String storeComment;


}

 

 

 

 

 

StoreMapper.xml

 

<resultMap id="storeStarResultMap" type="com.tastemate.domain.StoreVO">
<id column="STORE_IDX" property="storeIdx"/>
<result column="STORE_NAME" property="storeName"/>
<result column="CATEGORY1" property="category1"/>
<result column="STORE_ADDRESS" property="storeAddress"/>
<result column="STORE_LATI" property="storeLati"/>
<result column="STORE_LONGI" property="storeLongi"/>
<result column="PHONE_NUMBER" property="phoneNumber"/>
<result column="STORE_COUNT" property="storeCount"/>
<result column="FILENAME" property="filename"/>
<collection property="starVO" ofType="StarVO">
<id column="STORE_IDX" property="starIdx" />
<result column="STORE_IDX" property="storeIdx" />
<result column="USER_IDX" property="userIdx" />
<result column="STORE_STAR" property="storeStar" />
</collection>
</resultMap>

 

별점을 여러명이 주니까 평균을 어떻게 구할까 고민했는데

SQL문으로 해결 가능했다.

 

<select id="store_getList_withStar" resultMap="storeStarResultMap">
<!--select * from store-->
SELECT s.store_idx, s.user_idx, s.store_name, s.category1, s.store_address,
s.store_lati, s.store_longi, s.phone_number, s.store_count, s.filename,
avg_star.STORE_STAR
FROM STORE s
LEFT OUTER JOIN (
SELECT store_idx, ROUND(AVG(store_star), 1) AS STORE_STAR
FROM STAR
GROUP BY store_idx
) avg_star ON s.store_idx = avg_star.store_idx
ORDER BY s.store_idx
</select>

 

 

참고로 별점 평균만 보고 싶다면

select store_idx, round(avg(store_star),1)
from star group by store_idx;

 

 

 

list.html

 

별점을 객체로 가져왔고

타임리프 사용해서

별점이 0.0이 아닌 경우에만 별을 표시하는데

each로 수만큼 별점을 표현하도록 했다.

 

<span th:text="${storeVO.starVO.storeStar}"></span>

<th:block th:with="starCount=${storeVO.starVO.storeStar}">
<span th:if="${starCount != 0.0}" th:each="i: ${#numbers.sequence(1, starCount)}" class="yellow"></span>
</th:block>

 

참고로 별점 style은

.yellow {
color : #FFA500;
}

 

 

 

 



 

이분 블로그 참고했는데 

매우 글 잘 써놓으셨음!

 

 

[SQL] 사용자별 댓글 별점 평균 구하기

1. 댓글(REPLY) 테이블의 게시글 번호와, 별점 조회. SELECT PRODUCT_NO, REPLY_STAR FROM REPLY; 2. 게시글 번호의 평균 조회 (AVG, SUM등의 집계함수는 집계함수를 제외한 컬럼을 GROUP BY절로 묶어 주어야 한다.) SE

retrieverj.tistory.com