# reactionPoint(추천) 테이블 생성
CREATE TABLE reactionPoint (
id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
regDate DATETIME NOT NULL,
updateDate DATETIME NOT NULL,
memberId INT(10) UNSIGNED NOT NULL,
relTypeCode CHAR(50) NOT NULL COMMENT '관련 데이터 타입 코드',
relId INT(10) UNSIGNED NOT NULL COMMENT '관련 데이터 번호',
`point` SMALLINT(2) NOT NULL
);
# reactionPoint 테스트 데이터
# 1번 회원이 1번 article 에 싫어요
INSERT INTO reactionPoint
SET regDate = NOW(),
updateDate = NOW(),
memberId = 1,
relTypeCode = 'article',
relId = 1,
`point` = -1;
# 1번 회원이 2번 article 에 좋아요
INSERT INTO reactionPoint
SET regDate = NOW(),
updateDate = NOW(),
memberId = 1,
relTypeCode = 'article',
relId = 2,
`point` = 1;
테이블로 생성 하는 이유
: 다른 곳에서 비슷한 기능을 추가
하고 싶을때마다 해당 테이블의 컬럼을 추가해야 하기 때문에 reactionPoint테이블을 만들어 관련 데이터 타입
과, 관련 데이터 번호
만으로 관리하기 위함 memberId
를 남기는 이유는 게시물에 좋아요,싫어요를 한번만
하기위해 <td>${article.forPrintType1RegDate}</td>
article.getForPrintType1RegDate()
메소드를 활용1) article vo에 sum,good,badReactionPoint 추가
private int extra__sumReactionPoint;
private int extra__goodReactionPoint;
private int extra__badReactionPoint;
extra__sumReactionPoint : 좋아요, 싫어요 합
을 의미하는 필드
extra__goodReactionPoint : 좋아요 만 합
을 의미하는 필드
extra__badReactionPoint : 싫어요 만 합
을 의미하는 필드
2) getArticle 쿼리문
SELECT A.*, IFNULL(SUM(RP.point),0) AS extra__sumReactionPoint,
IFNULL(SUM(IF(Rp.point > 0,Rp.point,0)),0) AS extra__goodReactionPoint,
IFNULL(SUM(IF(Rp.point < 0,Rp.point,0)),0) AS extra__badReactionPoint
FROM
(SELECT A.* , M.nickname AS extra__writer
FROM article AS A
INNER JOIN `member` AS M
ON A.memberId = M.id
WHERE A.id = #{id} ) AS A
LEFT JOIN reactionPoint AS RP
ON RP.relTypeCode = 'article'
AND A.id = RP.relId
GROUP BY A.id
서브 쿼리를 활용하여 reactionPoint(추천) 관련 데이터를 가져옴
서브쿼리의 테이블
( 회원닉네임정보를 얻기위해 게시물 테이블에 회원테이블 조인한 테이블) 에
reactionPoint테이블을 LEFT조인 한 쿼리문
이때 조건은 게시물 아이디
= reactionPoint에 relId
(게시물 정보로 게시물의 id를 저장)
GROUP BY A.id : 게시물의 아이디로 그룹화 (집계함수를 사용하기위해)
LEFT 조인 한결과, reactionPoint테이블에 조인조건에 해당하는 데이터가 없으면 null값으로 나타내기 때문에 IFNULL
사용
IFNULL(SUM(RP.point),0)
: 전체 합 (좋아요(1), 싫어요(-1)의 합
)으로 종합 추천수를 나타냄
IFNULL(SUM(IF(Rp.point > 0,Rp.point,0)),0)
: 좋아요만을 합산한것을 나타냄
IFNULL(SUM(IF(Rp.point < 0,Rp.point,0))
: 싫어요만을 합산한것을 나타냄
<,>
: mybatis에서 부등호 (<,>) 사용 하기위해 부등호를 직접 쓰면 오류