생각을 개발하자, 박진형

[node.js] 프로젝트 - 핫키워드 + 댓글 한번에 뽑기 : mysql 테이블 join 본문

Javascript/node.js

[node.js] 프로젝트 - 핫키워드 + 댓글 한번에 뽑기 : mysql 테이블 join

imjinbro imjinbro 2017.08.08 19:12
[댓글 조회기능]
- 프로젝트에서 사용하는 테이블
(1) 키워드 
=> mysql 데이터타입에 관한 문서 : https://dev.mysql.com/doc/refman/5.5/en/data-types.html

- id MEDIUMINT
- 키워드들 VARCHAR
- 키워드설명 VARCHAR
- 저장된시간 DATE


(2) 댓글 : 현재 게시되어져있는 키워드 랭킹에 대한 유저들의 반응
=> 1개의 키워드 랭킹이 여러개의 댓글을 가지는 관계(1:N)
=> 키워드 테이블에 저장된 레코드의 id를 댓글 레코드를 저장할 때 같이 저장함 : 저장된 댓글 레코드는 어떤 키워드 레코드와 연결되어있는지(쿼리문 - join)

- id MEDIUMINT
- 유저명 VARCHAR
- 코멘트내용 VARCHAR
- 키워드테이블명_id MEDIUMINT
 

- 테이블 join 활용
(1) db 테이블끼리 관계를 맺어줌 : 연관있는 데이터 테이블끼리 관계를 맺어주는 것
(2) 테이블 관계성에 따라 테이블 결합, 하나의 테이블 속의 결과물 출력
- ex) 게시글 테이블과 댓글 테이블 : 게시글 1개 레코드가 댓글 여러개 레코드를 가짐, 테이블끼리 그런 관계를 맺어줌
- 대표되는 데이터를 저장하는 db를 둠으로서 하나의 데이터만 변경해도 관련된 여러개의 데이터에 영향을 줄 수 있음
=> 한번의 처리로 여러번 처리할 것을 줄일 수 있음


(3) 프로젝트 : index 컨트롤러에서 데이터를 가져올 때 테이블 결합(join)부터 해두고, 조건 형성
- join 조건에 사용되는 ON과 결합된 테이블에서 필요한 데이터를 고르는 조건(where, limit 등)은 별개
- 뽑아올 때(SELECT) 가장 먼저 join부터 시켜놓고 데이터를 가져온다고 생각해야함 : 두 단계를 거침
- CREATE와 SELECT에서 주의하면 됨 


(4) 쿼리 짤 때 참고
- OUTER JOIN 과 INNERT JOIN에서 선택
=> outer join과 inner join의 차이 : 테이블 결합 했을 때 한 쪽 데이터가 NULL일 때 표시하느냐(outer) 마느냐(inner), 표시 후 뽑아쓰기(쿼리 조건)

- ON의 역할 : join시 어떤 조건, 가장 중요
- LEFT / RIGHT : 어떤 테이블을 중심으로 결합해서 데이터를 리턴할 것인지
=> LEFT : 왼쪽 테이블의 모든 행을 가지고 오른쪽 테이블 행과 비교, ON을 통해 비교, 조건에 맞는 값이 없으면 NULL로 출력
=> RIGHT : 반대
=> 키워드 랭킹을 왼쪽, 댓글을 오른쪽 : 댓글 레코드가 존재하는 키워드 랭킹을 뽑는게 아니라 키워드랭킹 중 댓글을 뽑아냄(LEFT JOIN)
    => OUTER JOIN : 어떤 테이블의 모든 데이터를 뽑아낼지, 기준은 모두 뽑고 / 비교하는 쪽은 존재하지않으면 NULL로 뽑아내고 / 뽑은 후 조건문

=> LEFT JOIN 과 RIGHT JOIN 데이터 리턴 차이 이미지

=> LEFT JOIN



=> RIGHT JOIN


=> LEFT JOIN 왼쪽에 위치할 테이블 : 키워드 랭크 테이블 중 최근 1개의 키워드 랭크 레코드
=> LEFT JOIN 오른쪽에 위치할 테이블 : 댓글 테이블 전체
=> JOIN 조건(ON) : 최근 1개의 키워드 랭크 id값과 같은 best_id 값을 가진 댓글 테이블 레코드 모두(왼쪽과 왼-오 교집합)
=> 그리고 출력할 때에는 1개의 레코드로 뽑아내기위해서 GROUP_CONCAT을 사용함 : 중복해서 뽑히는 컬럼을 없앰
=> 최종 쿼리
SELECT r.*, GROUP_CONCAT(c.name SEPARATOR "-") AS comment_user, GROUP_CONCAT(c.content SEPARATOR "-") AS comment_content 

    FROM (SELECT * FROM best ORDER BY id DESC LIMIT 1) AS r LEFT JOIN comment AS c ON r.id = c.best_id;



[프로젝트 URL]

http://www.politics-watch.com/