인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김동현님의 프로필 이미지
김동현

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

시퀄라이즈 코드 질문드립니다.

해결된 질문

작성

·

548

0

안녕하세요. 맨날 시퀄라이즈 질문만 드리게 되어 죄송합니다.ㅠㅠ

다름이 아니고,

좋아요 순으로 노드버드의 게시물을 정렬하는 GET 메소드를 만들고 싶은데요.

이런 식으로 쿼리를 짜보았습니다. (적절한지 평가해주시면 감사하겠습니다)

이 알고리즘을 시퀄라이즈 findAll로 표현하고 싶은데, 잘 안됩니다ㅠㅠ

게시물들을 좋아요 순서로 정렬하는 방법도 알려주심 안될까요..?

답변 6

0

김동현님의 프로필 이미지
김동현
질문자

콘솔 쿼리 보면서 해결했습니다 감사합니다!!

      order: [[sequelize.literal("(COUNT(`likers->like`.`PostId`))"), "DESC"]],

이렇게 하니까 되네요.

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

저기 객체 안에 Likers는 시퀄라이즈가 만들어주는 객체이고요. 실제 DB와는 다릅니다. COUNT(`Likers`.`id`) 이런 식으로 DB에 적혀있는 테이블명과 컬럼명을 구분해야 할 것 같네요(``가 테이블과 컬럼을 구분해줍니다) sequelize.literal을 쓰기 시작할 때부터는 SQL문법을 어느정도 그대로 쓰셔야 합니다. 그리고 시퀄라이즈 쿼리를 할 때 콘솔에 나오는 쿼리를 분석해보는 것도 좋습니다. 그걸 기반으로 바꿔야하거든요.

0

김동현님의 프로필 이미지
김동현
질문자

      order: [[sequelize.literal('COUNT(Likers.id)'), 'DESC']],
SequelizeDatabaseError: Unknown column 'Likers.id' in 'order clause'
    at Query.formatError (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/dialects/mysql/query.js:239:16)
    at Query.run (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/dialects/mysql/query.js:54:18)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async /Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/sequelize.js:619:16
    at async MySQLQueryInterface.select (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/dialects/abstract/query-interface.js:938:12)
    at async Function.findAll (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/model.js:1753:21)
    at async /Users/donghyun/Documents/react-sns/back/routes/posts.js:45:19

order 문을 사용했더니 위 에러가 발생합니다.  Likers.id가 왜 알 수 없는 컬럼이라고 나올까요..

Post 객체의 구조는 다음과 같습니다.

Post 안에 Likers가 분명 있는데요..ㅠㅠ

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

sequelize.literal을 안 쓰고는 COUNT같은 것을 처리하기는 어렵습니다. 에러가 나면 무슨 에러가 나는지 알려주세요.

0

김동현님의 프로필 이미지
김동현
질문자

감사합니다!

근데 ORDER BY 이전까지 시퀄라이즈로 표현하는게 되게 힘드네요ㅠㅠㅠ

sequelize.literal를 쓰지 않고

단순히 Post 객체 내부에 있는 Likers의 length로 정렬할 수 있는 방법은 없을까용..?

const posts = await Post.findAll({
      where,
      limit: 10,
      order: [[sequelize.literal('COUNT(Likers.id)'), 'DESC']],
      include: [
      {
        model: User, // 좋아요 누른 사람
        as: 'Likers',
        attributes: ['id'],
      },
      ],
    });

저런 의미의 order문이 들어가면 될 것 같은데 오류가 나네요..........

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

order: [[sequelize.literal('COUNT(likes.PostId)'), 'DESC']]

이거 쓰시면 됩니다.
김동현님의 프로필 이미지
김동현

작성한 질문수

질문하기