• MySQL) 테이블 합치고 조회, 중복데이터 문제

    2022. 12. 23.

    by. Sohyun

    더보기 버튼을 누르면 검색어를 입력하여 게시판, 댓글을 조회하여 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

    댓글