인프런 커뮤니티 질문&답변
시퀄라이즈 메서드관련 질문
작성
·
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 posts.js - prepare - Visual Studio Code [Administrator] 2022-09-30 오후 11_52_48 (2).png](https://cdn.inflearn.com/public/files/posts/62ebc41b-35a9-4746-a7a5-a97504782fe9/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 posts.js - prepare - Visual Studio Code [Administrator] 2022-09-30 오후 11_51_13 (2).png](https://cdn.inflearn.com/public/files/posts/4e8fd108-60c0-4053-b5f1-c0c92f4f27fd/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);
}
});.png)
답변 1
0
말씀하신 SQL문이 MYSQL에서 작성한 쿼리를 말씀해주시는걸까여?
아니면 시퀄라이즈의 코드를 말씀해주시는걸까요?
제가 SQL문은 사용방법을 아직 몰라서 강의에서 설명하신 시퀄라이즈 코드로만 작성하고 있습니다.
올리신 첫 두 이미지를 보시면 sql문이 있잖아요. 그걸 자르지말고 올리시면 됩니다. 이래서 에러메시지를 잘라서 올리시면 안 됩니다. 안 그랬으면 한방에 해결해드렸을테니까요
죄송합니다. 앞으로 유의하겠습니다
말씀해주신 SQL문 함께 첨부하겠습니다.
그리고 게시글의 좋아요순으로 정렬을 한 뒤
추가로 좋아요가 0개인 게시글은 가져오지 않는다는 WHERE절을 추가하고 싶은데 이또한 시퀄라이즈에서 어떻게 설정하는지 알 수 있을까요?
// 설정 시 아래와 같은 오류가 발생했습니다.
order: [[Sequelize.literal('COUNT(Likers.id)'), 'DESC']],
조인된 로우 개수를 세는 것은 조금 난이도가 있습니다. 이런 식으로 distinct 문을 사용하셔야 하는데 제 생각엔 우ㅏ크벤치에서 한 번 먼저 연습을 해보고 하셔야 할 것 같습니다.
https://stackoverflow.com/questions/20119901/counting-number-of-joined-rows-in-left-join
제가 강의에서는 시간 상의 이유로 sql을 생략하고 알려드렸는데 복잡한 기능을 구현하려면 결국 sql을 따로 학습하셔야 합니다.
근데 이게 공식문서, 구글링으로 답을 찾았습니다.
어떠한 자료를 봐도 동일한 답변인데 제가 작성하면 계속 같은 오류가 발생하네요.
백틱이나 따옴표 뭔가 한부분에서 사소한 오타가 나고있는건지, 도저히 문제를 찾기가 힘드네요 ㅜㅜ
혹시 이 문제에 대해서 피드백좀 부탁드려도 될까요?
제가 참고했던 자료이고, 다른곳에서도 동일한 답변을 확인했습니다.
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);
}
});

답변 감사합니다
네네 대문자로 해도 동일하게
sqlMessage: "Unknown column 'Likers->Like.PostId' in 'order clause'",만 발생되고있습니다.
사소한 오타문제일것같아서 소문자, 대문자, 백틱, 작은 큰 따옴표 전부 다 해봤는데도 동일하게 저 에러만 발생하네요
괜찮습니다!! 늦은 시간에 계속 질문드려서 오히려 제가 죄송합니다
혹시 오늘 이후라도 시간 괜찮으실때 말씀해주신 분석결과를 알 수 있을까요?
저도 그전까지 다른 해결방법이 있는지 계속 찾아볼 예정입니다.
아.. 미처 그 부분은 생각하지 못했네요
말씀하신 텍스트 첨부하도록 하겠습니다. 감사합니다.
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를 하고 있네요.
시퀄라이즈가 이상하게 짜주는 것이라 어떻게 수정해야할지 애매하네요 ㅠㅠ
그렇군요 저도 몇일동안 해결해보려고 노력해봤는데 안되겠네요..ㅜㅜ
시퀄라이즈랑, SQL을 더 공부해서 추후에라도 문제를 해결해봐야겠네요
답변해주신것들 전부 감사했습니다!!





답변 감사합니다.
DB는 처음다뤄봐서 말씀해주신 조언을 듣고 다시 시퀄라이즈코드를 작성해봐도 원하는 결과를 얻기 힘드네요
SQL의 전체 테이블을 첨부하겠습니다. 이러한 테이블구조에서는 어떻게 시퀄라이즈 코드를 작성해야될까요?