IFNULL()
- IFNULL() 함수는 표현식이 NULL인 경우 지정된 값을 반환한다. 표현식이 NULL이 아닐 경우 함수는 표현식으로 반환한다.
IFNULL(expression, alt_value)
ex) IFNULL(SUM(IF(RP.point < 0,RP.point,0)),0)
만약 expression 부분이 NULL이라면 alt_value 값을 반환하고, 그렇지 않으면 expression 반환
INNER JOIN
- 두 개의 테이블을 조인할 때, 두 테이블 간에 일치하는 데이터만을 가져온다. => 일치하지 않은 데이터는 불러오지 않는다.
- inner join은 조인 상태에 따라 2개의 테이블의 컬럼을 합쳐서 새로운 테이블을 생성한다. 즉, 교차된 조인을 한 결과에 조인 조건문을 충족시키는 레코드를 반환
LEFT JOIN
- left join은 outer join 중 하나 / outer join은 합집합!!!
- 왼쪽에 있는 테이블의 모든 행을 조회한다. 두 테이블 간에 일치하지 않은 컬럼에 해당되는 값들은 전부 null 값으로 처리된다.
서브 쿼리
- 서브쿼리는 다른 쿼리 내부에 포함되어 있는 SELECT문을 의미 / 서브쿼리를 포함하고 있는 쿼리를 외부쿼리라고 부르고, 서브쿼리는 내부쿼리라고 부른다.
쉽게 말하면 SELECT문 안에 SELECT 문
서브쿼리의 장점은
서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해주고, 서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다.
서브쿼리
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) AS A
LEFT JOIN reactionPoint AS RP
ON A.id = RP.relId AND RP.relTypeCode = 'article'
GROUP BY A.id
ORDER BY A.id DESC;
좋아요 기능 구현 ❤️
SELECT A.*, M.nickname AS extra__writer,
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 article AS A
INNER JOIN `member` AS M
ON A.memberId = M.id
LEFT JOIN reactionPoint AS RP
ON A.id = RP.relId AND RP.relTypeCode = 'article'
WHERE A.id = #{id}
detail 쿼리 안에 좋아요 관련 join
<script>
SELECT A.* , M.nickname AS extra__writer,
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 article AS A
INNER JOIN `member` AS M
ON A.memberId = M.id
LEFT JOIN reactionPoint AS RP
ON A.id = RP.relId AND RP.relTypeCode = 'article'
WHERE 1
.
.
.
여기서 처음 코드를 짰을 때 아래와 같은 오류가 났다.
마크업이라는 힌트를 얻고,
script 안에 부등호로 표시한 >, < 을 시작과 끝을 구분하거나, 특수한 기능을 수행하기 위해 사용되기 때문에 그 자체로는 텍스트로서의 의미를 갖지 않는다.
이 이유로 특수문자 엔티티로 표현하여 웹페이지의 구조와 내용을 올바르게 표현하도록 한다.
" " : 공백(스페이스 한 칸)
< 부등호 (<)
> 부등호 (>)
& 앰퍼샌드(&)
" 쌍따옴표(")
# sharp(#)
' 따옴표(')
update join
- 데이터를 수정하고 싶을 때 Update를 사용, 조건에 맞는 데이터만 수정하고자 한다면 Update 구분에 WHERE 절에 추가하여 사용하면 된다.
만약, 조건에 해당하는 컬럼이 다른 테이블에 있는 경우 Update와 Join절을 같이 사용한다.
UPDATE article AS A
INNER JOIN (
SELECT RP.relTypeCode, Rp.relId,
SUM(IF(RP.point > 0,RP.point,0)) AS goodReactionPoint,
SUM(IF(RP.point < 0,RP.point * -1,0)) AS badReactionPoint
FROM reactionPoint AS RP
GROUP BY RP.relTypeCode,Rp.relId
) AS RP_SUM
ON A.id = RP_SUM.relId
SET A.goodReactionPoint = RP_SUM.goodReactionPoint,
A.badReactionPoint = RP_SUM.badReactionPoint;
문제해결을 위한 고민..
다음의 문제는 좋아요 싫어요 버튼으로 처리할 수 있도록, 좋아요 또는 싫어요 버튼을 누르면? 그 다음 어떤 일이 일어나야 하는지, 어떤 테이블에 영향을 주어야 하는지..
좋아요 버튼을 누르면 일단 취소버튼은 생각하지 말고, 숫자 증가와 버튼 형식이 바뀌어야하고, 만약 좋아요 버튼을 회원이 눌렀다면 그 회원은 다시 한번더 좋아요 버튼을 누를 수 없다. -> 보통의 기능
일단 먼저 생각해보았을 때 어떤 클래스(?)에서 회원이 눌렀다는 저장? 또는 표시를 해주었다면 거기에 따라서 if 문으로 걸면?? 또는 ajax로 어떻게..?
로컬스트리지로 회원 id 저장하고, 로컬스트리지 안의 회원 di와 비교해서 있으면 -1, 없으면 +1
=> detail.jsp에서 ajax 이용해서 할 수 있나? 또는 c:if를 이용하여 처리 ajax 적용..?
계속 고민을 해보았는데.. 뭔가 빙글빙글 도는 느낌...
'Spring' 카테고리의 다른 글
SPRING (08.26) - 좋아요 ajax 적용 (1) | 2024.08.26 |
---|---|
회원가입 시나리오 정리 (0) | 2024.08.25 |
SPRING(08.21) - Ajax (Asynchronous JavaScript and XML), 조회수 증가, 로컬스트리지 (0) | 2024.08.21 |
SPRING(08.20) - 검색창(sql 검색), 검색 기능 구현 (0) | 2024.08.20 |
SPRING(08.20) - 정적, 동적 페이지네이션 (0) | 2024.08.20 |