ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2019-08-27 개발일지
    개발일지 2019. 8. 27. 14:30

    오늘은 쿼리관려해서 문제 하나가 오전부터 오후 2시까지 시간을 잡아먹었다. ㅡ"ㅡ

     

    기존 공지사항 기능에 댓글이 없었는데 댓글이 추가되는 바람에 댓글 테이블을 설계했고, 기존 목록을 조회하는 쿼리를 수정하는 과정에서 문제가 발생했다.

     

    글 제목 (댓글 카운트 수) 이런식으로 제목을 뽑으려고 시퀄라이즈 쿼리 옵션을 이리저리 수정하고 있었는데 쿼리가 계속 래핑되어 수행이 되서 말썽이었다.

     

    BoardModel.findAndCountAll({
    	attributes: [ [ sequelize.fn('COUNT', sequelize.col('board_comments.id')), 'commentCount' ] ], 
    	include: [ { model: BoardCommentModel, attributes: [] } ], 
    });

    대략 이런 쿼리였는데,  내가 예상했던 조회 쿼리는 아래와 같다.

     

    SELECT 
        board.id, 
        COUNT(board_comments.id) AS commentCount 
    FROM 
        board
    INNER JOIN 
        board_comments
    ON 
        board.id = board_comments."boardId"

     

    근데 얘가 아래처럼 실행 되더라.

    SELECT 
        board.*
    FROM 
        (SELECT 
            board.id, 
            COUNT(board_comments.id) AS commentCount 
        FROM 
            board)
    INNER JOIN 
        board_comments
    ON 
        board.id = board_comments."boardId"

     

    이러니 래핑 쿼리 안에 있는 COUNT()함수 내의 테이블(board_comments)를 찾을 수가 없어서 자꾸 쿼리 오류가 났다.

     

    로우 쿼리를 작성해서 하기엔 자존심도 상하고 분명 컨트롤 할 수 있는 방법이 있을거라 생각해서 이리저리 찾아보다가  도움을 요청했고 답변을 받아 결국 해결방안을 찾았다.

    노d님 감사합니다 (_ _)

     

    시퀄라이즈의 model.d.ts의 IncludeOptions를 확인해보면 subQuery 속성을 찾아 볼 수 있다.

    결국 위와 같이 래핑하는 방식도 서브쿼리인 것이고, subQuery 옵션을 false로 설정하면 해결되는 것이었다.

     

    BoardModel.findAndCountAll({
    	subQuery: false, 
    	attributes: [ [ sequelize.fn('COUNT', sequelize.col('board_comments.id')), 'commentCount' ] ], 
    	include: [ { model: BoardCommentModel, attributes: [] } ], 
    });

     

    '개발일지' 카테고리의 다른 글

    2019-08-29 개발일지  (0) 2019.08.29
    2019-08-28 개발일지  (0) 2019.08.28
    2019-08-26 개발일지  (0) 2019.08.26
    2019-08-23 개발일지  (0) 2019.08.23
    2019-08-22 개발일지  (0) 2019.08.22
Designed by Tistory.