강의

멘토링

커뮤니티

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

hib4888님의 프로필 이미지
hib4888

작성한 질문수

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

쿼리스트링과 lastId 방식

시퀄라이즈 메서드관련 질문

작성

·

472

0

안녕하세요. 제로초님 강의 잘듣고있습니다.

강의를 응용하면서 좋아요 순으로 게시글을 가져오는 라우터를 만들고 있습니다.

sequelize.literal을 사용해서 여러 시도를 해봤지만 동일하게 컬럼을 알 수 없다고 오류가 발생합니다.

 

order: [[sequelize.literal('COUNT(Likers.id)'), 'DESC']],

posts.js - prepare - Visual Studio Code [Administrator] 2022-09-30 오후 11_52_48 (2).png

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

posts.js - prepare - Visual Studio Code [Administrator] 2022-09-30 오후 11_51_13 (2).png

DB는 처음 접해봐서 구글링, 공식문서를 참고해도 도저히 해결하기 힘들어서 질문드리겠습니다.

참고자료도 함께 첨부하겠습니다.

const express = require('express');
const { Sequelize, Op } = require('sequelize');

const { Post, User, Image, Comment } = require('../models');

const router = express.Router();

router.get('/top', async (req, res, next) => { // loadTopPostsAPI / GET /posts/top
  try {
    const posts = await Post.findAll({
      limit: 20,
      offset: 0,      
      // Likers의 갯수로 정렬하려면 조건은 어떻게 해야하나요?
      order: [[Sequelize.literal("(COUNT(`likers->like`.`PostId`))"), "DESC"]],
      include: [{
        model: User,
        attributes: ['id', 'nickname'],
      }, {
        model: Image,
      }, {
        model: Comment,
        include: [{
          model: User,
          attributes: ['id', 'nickname'],
        }],
      }, {
        model: User,
        as: 'Likers',
        attributes: ['id'],
      }],
    })
    res.status(200).json(posts);
  } catch (error) {
    console.error(error);
    next(error);
  }
});

Recipe.io - Chrome 2022-09-30 오후 11_19_53 (2).png

답변 1

0

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

SQL에서는 테이블 이름이 likers가 아닐 겁니다. 전체 sql을 봐야 테이블 이름을 알수있을 것 같네요.

hib4888님의 프로필 이미지
hib4888
질문자

답변 감사합니다.

DB는 처음다뤄봐서 말씀해주신 조언을 듣고 다시 시퀄라이즈코드를 작성해봐도 원하는 결과를 얻기 힘드네요

SQL의 전체 테이블을 첨부하겠습니다. 이러한 테이블구조에서는 어떻게 시퀄라이즈 코드를 작성해야될까요?

image

 

 

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

이 테이블 모양이 중요한 게 아니고 SQL문이 중요합니다. SQL을 올려주세요. 일단 like.PostId가 컬럼명일 것 같습니다.

hib4888님의 프로필 이미지
hib4888
질문자

말씀하신 SQL문이 MYSQL에서 작성한 쿼리를 말씀해주시는걸까여?

아니면 시퀄라이즈의 코드를 말씀해주시는걸까요?

제가 SQL문은 사용방법을 아직 몰라서 강의에서 설명하신 시퀄라이즈 코드로만 작성하고 있습니다.

 

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

올리신 첫 두 이미지를 보시면 sql문이 있잖아요. 그걸 자르지말고 올리시면 됩니다. 이래서 에러메시지를 잘라서 올리시면 안 됩니다. 안 그랬으면 한방에 해결해드렸을테니까요

hib4888님의 프로필 이미지
hib4888
질문자

죄송합니다. 앞으로 유의하겠습니다

말씀해주신 SQL문 함께 첨부하겠습니다.

그리고 게시글의 좋아요순으로 정렬을 한 뒤

추가로 좋아요가 0개인 게시글은 가져오지 않는다는 WHERE절을 추가하고 싶은데 이또한 시퀄라이즈에서 어떻게 설정하는지 알 수 있을까요?

// 설정 시 아래와 같은 오류가 발생했습니다.
 order: [[Sequelize.literal('COUNT(Likers.id)'), 'DESC']],

image

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

제가봤을 때는 그냥 `Likers`.`id` 하시면 될 것 같은데요? 백틱 안 쓰셔서 그런 것 같습니다.

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

조인된 로우 개수를 세는 것은 조금 난이도가 있습니다. 이런 식으로 distinct 문을 사용하셔야 하는데 제 생각엔 우ㅏ크벤치에서 한 번 먼저 연습을 해보고 하셔야 할 것 같습니다.

https://stackoverflow.com/questions/20119901/counting-number-of-joined-rows-in-left-join

제가 강의에서는 시간 상의 이유로 sql을 생략하고 알려드렸는데 복잡한 기능을 구현하려면 결국 sql을 따로 학습하셔야 합니다.

hib4888님의 프로필 이미지
hib4888
질문자

답변 정말 감사합니다

백틱을 사용해서 수정했는데도 동일하게 'Likers.id'컬럼을 알 수 없다고 오류가 발생하네요

조언해주신대로 시퀄라이즈랑 sql을 좀 더 공부해서 문제를 해결해봐야겠네요

감사합니다!!

 

 

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

네 이게 컬럼 이름이 sql문에서 중간에 바뀌었는데 어떻게 바뀌었는지를 눈으로만 보기엔 좀 헷갈리네요.

hib4888님의 프로필 이미지
hib4888
질문자

근데 이게 공식문서, 구글링으로 답을 찾았습니다.

어떠한 자료를 봐도 동일한 답변인데 제가 작성하면 계속 같은 오류가 발생하네요.

백틱이나 따옴표 뭔가 한부분에서 사소한 오타가 나고있는건지, 도저히 문제를 찾기가 힘드네요 ㅜㅜ

혹시 이 문제에 대해서 피드백좀 부탁드려도 될까요?

 

제가 참고했던 자료이고, 다른곳에서도 동일한 답변을 확인했습니다.

https://github.com/sequelize/sequelize/issues/7634

 

제가 마지막으로 시도했던 코드와 오류입니다

const express = require('express');
const { Sequelize, Op } = require('sequelize');

const { Post, User, Image, Comment } = require('../models');

const router = express.Router();

router.get('/top', async (req, res, next) => { // loadTopPostsAPI / GET /posts/top
  try {
    const posts = await Post.findAll({
      limit: 20,
      offset: 0,                     
      order: [[Sequelize.literal("(COUNT(`likers->like`.`PostId`))"), "DESC"]],      
      include: [{
        model: User,
        attributes: ['id', 'nickname'],
      }, {
        model: Image,
      }, {
        model: Comment,
        include: [{
          model: User,
          attributes: ['id', 'nickname'],
        }],
      }, {
        model: User,
        as: 'Likers',
        attributes: ['id'],               
      }],          
    })
    res.status(200).json(posts);
  } catch (error) {
    console.error(error);
    next(error);
  }
});

 

image

 

 

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

L 대문자로 해도 안 되나요? L은 아무리봐도 대문자여야할 것 같습니다.

hib4888님의 프로필 이미지
hib4888
질문자

답변 감사합니다

네네 대문자로 해도 동일하게

sqlMessage: "Unknown column 'Likers->Like.PostId' in 'order clause'",만 발생되고있습니다.

사소한 오타문제일것같아서 소문자, 대문자, 백틱, 작은 큰 따옴표 전부 다 해봤는데도 동일하게 저 에러만 발생하네요

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

이거 datagrip같은 툴로 sql 분석하면 바로 어떻게 작성해야 존재하는 컬럼이 되는지 나오는데 제가 그걸 지금 해드릴수가 없네요 ㅠㅠ

hib4888님의 프로필 이미지
hib4888
질문자

괜찮습니다!! 늦은 시간에 계속 질문드려서 오히려 제가 죄송합니다

혹시 오늘 이후라도 시간 괜찮으실때 말씀해주신 분석결과를 알 수 있을까요?

저도 그전까지 다른 해결방법이 있는지 계속 찾아볼 예정입니다.

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

자, 여기서 제가 분석을 하려면 어떻게 하셔야 할까요??

hib4888님의 프로필 이미지
hib4888
질문자

분석이라고 하셔서 전문적인 sql지식이 있어야하는 줄 알았습니다

datagrip 툴로 제가 결과를 확인하고 해결해보겠습니다

감사합니다!!

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

에러메시지를 텍스트로 올려주셔야겠죠?? ㅎㅎ

hib4888님의 프로필 이미지
hib4888
질문자

아.. 미처 그 부분은 생각하지 못했네요

말씀하신 텍스트 첨부하도록 하겠습니다. 감사합니다.

 

code: 'ER_BAD_FIELD_ERROR',

errno: 1054,

sqlState: '42S22',

sqlMessage: "Unknown column 'Likers->Like.PostId' in 'order clause'",

sql: 'SELECT Post.*, User.`id` AS User.id, User.`nickname` AS User.nickname, Images.`id` AS Images.id, Images.`src` AS Images.src, Images.`createdAt` AS Images.createdAt, Images.`updatedAt` AS Images.updatedAt, Images.`PostId` AS Images.PostId, Comments.`id` AS Comments.id, Comments.`content` AS Comments.content, Comments.`createdAt` AS Comments.createdAt, Comments.`updatedAt` AS Comments.updatedAt, Comments.`UserId` AS Comments.UserId, Comments.`PostId` AS Comments.PostId, Comments->User.`id` AS Comments.User.id, Comments->User.`nickname` AS Comments.User.nickname, Likers.`id` AS Likers.id, Likers->Like.`createdAt` AS Likers.Like.createdAt, Likers->Like.`updatedAt` AS Likers.Like.updatedAt, Likers->Like.`PostId` AS Likers.Like.PostId, Likers->Like.`UserId` AS Likers.Like.UserId FROM (SELECT Post.`id`, Post.`title`, Post.`desc`, Post.`ingredient`, Post.`recipes`, Post.`tips`, Post.`tags`, Post.`createdAt`, Post.`updatedAt`, Post.`UserId` FROM posts AS Post ORDER BY (COUNT(`Likers->Like`.`PostId`)) DESC LIMIT 0, 20) AS Post LEFT OUTER JOIN users AS User ON Post.`UserId` = User.`id` LEFT OUTER JOIN images AS Images ON Post.`id` = Images.`PostId` LEFT OUTER JOIN comments AS Comments ON Post.`id` = Comments.`PostId` LEFT OUTER JOIN users AS Comments->User ON Comments.`UserId` = Comments->User.`id` LEFT OUTER JOIN ( Like AS Likers->Like INNER JOIN users AS Likers ON Likers.`id` = Likers->Like.`UserId`) ON Post.`id` = Likers->Like.`PostId` ORDER BY (COUNT(`Likers->Like`.`PostId`)) DESC;',

parameters: undefined

},

 

 

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

보니까 구문이 조금 이상한 게 ORDER BY를 할 수 없는 곳에서 ORDER BY를 하고 있네요.

시퀄라이즈가 이상하게 짜주는 것이라 어떻게 수정해야할지 애매하네요 ㅠㅠ

hib4888님의 프로필 이미지
hib4888
질문자

그렇군요 저도 몇일동안 해결해보려고 노력해봤는데 안되겠네요..ㅜㅜ

시퀄라이즈랑, SQL을 더 공부해서 추후에라도 문제를 해결해봐야겠네요

답변해주신것들 전부 감사했습니다!!

 

hib4888님의 프로필 이미지
hib4888

작성한 질문수

질문하기