-
더보기 버튼을 누르면 검색어를 입력하여 게시판, 댓글을 조회하여 10개씩 붙이는 부분이 있었다.
페이징은 잘되고 있는데 중복데이터가 불러와지고 있다.
원인을 찾아보니 무분별한 join문 사용의 부작용으로 인한 행 뻥튀기…!
이 쿼리에는 게시물테이블에 댓글테이블, 댓글카운트테이블, 사용자테이블 붙고 있었는데(총 4개의 합)
1대 n의 관계를 가지고 있는 댓글테이블이 원인인 것 같았다.
댓글에서도 검색을 해야 해서 제거할 수는 없고 중복데이터는 어떻게 없애주어야 할까..??
게시글은 하나씩만 보여주어야 하니까 게시글 시퀀스 기준으로 중복제거 하면 되겠다~ 생각함
중복제거방법은 여러가지 방법이 있지만 distinct와 group by를 많이 사용하는 것 같아 알아보았다.
- distinct
데이터가 많아지면 성능이 느려지는 부분이 있으므로 사용한다면
결과에서 붙이는 것보다는 join하려는 테이블의 컬럼에 붙이면 더 빠를 수 있다.
SELECT A.ARTICLE_SEQ FROM ARTICLE A INNER JOIN (SELECT DISTINCT ARTICLE_SEQ FROM ARTICLE_CMTS) AS B ON A.ARTICLE_SEQ = B.ARTICLE_SEQ
- group by
SELECT A.ARTICLE_SEQ FROM ARTICLE A INNER JOIN ARTICLE_CMTS AS B ON A.ARTICLE_SEQ = B.ARTICLE_SEQ GROUP BY A.ARTICLE_SEQ
정리 : 1대 다 조인시에는 ‘JOIN 전에 중복 제거’가 필요한지 한 번 더 생각하기! 😯
테이블 간의 관계를 확인했어야..
게시글과 댓글은 겹치는 행이 많아서 조인을 해야 하는줄 알았는데
게시글 또는 댓글에 있는 검색어를 각각 찾아야 하는 문제이니 union을 사용하는 것이 맞겠다는 생각이 들었다.
(게시글 + 댓글) 후 검색 → (게시글 검색 + 댓글검색) & 중복제거
심지어 중복제거도 안해서 행이 여러개였던 과거..청산하고 싶다.
union을 사용해 두 쿼리를 합칠 때 중복 제거보기로 하였다.
이건 왜 뒤에 x 안붙이면 실행이 안되는가.. 서브 쿼리 문법을 참고하도록 하자
각각의 합을 더한후 합치는 쿼리 (=> 이는 중복제거가 안된다.)
SELECT SUM(CNT) FROM (SELECT COUNT(*) AS CNT FROM ARTICLE WHERE TITLE LIKE '%검색어%' OR CONTENTS LIKE '%검색어%' UNION SELECT COUNT(*) AS CNT FROM ARTICLE_CMTS WHERE CONTENTS LIKE '%검색어%') AS SUM
쿼리 두개의 중복제거 후 갯수를 구하도록 하는 쿼리
SELECT COUNT(*) FROM (SELECT ARTICLE_SEQ FROM ARTICLE WHERE TITLE LIKE '%검색어%' OR CONTENTS LIKE '%검색어% UNION SELECT ARTICLE_SEQ FROM ARTICLE_CMTS WHERE CONTENTS LIKE '%검색어%') X
'데이터베이스' 카테고리의 다른 글
sqldeveloper) mysql -> oracle migration하기 (0) 2023.11.07 docker로 oracle 연결하기 (0) 2023.11.06 제 49회 sqld 합격후기 (0) 2023.07.09 MinIO) 로컬에서 파일업로드(Java) (0) 2023.01.10 댓글