category 외래키
설정하면 컬럼명 앞에 붉은색이 된다.
SELECT 별칭, 요약정보
AS
SELECT name AS category_name FROM books LEFT
JOIN category ON books.category_id = category_id;
업데이트
ERD 다이어그램
books N : 1 category
외래키 연결?
Ref: books.category_id > category.id
코드 BookController.js
let sql = `SELECT * FROM books
LEFT JOIN category ON books.category_id = category_id
WHERE books.id = ?`;
출간기준 시간 범위 구하기
MySQL
시간 더하기
DATE_ADD(기준일자, 간격INTERVAL)
시간 빼기
DATE_SUB(기준 날짜, 간격INTERVAL)
시간 범위를 설정해서 SELECT
SELECT * FROM books WHERE pub_date BETWEEN date_sub(now(), interval 6 month) AND now();
코드 if 문 정리
const allBooks = (req, res) => {
let { category_id, news } = req.query;
let sql = "SELECT * FROM books";
let values = [];
if (category_id && news) {
sql +=
" WHERE category_id=? and pub_date BETWEEN date_sub(now(), interval 6 month) AND now()";
values = [category_id, news];
} else if (category_id) {
sql += " WHERE category_id = ?";
values = category_id;
} else if (news) {
sql += " WHERE pub_date BETWEEN date_sub(now(), interval 6 month) AND now()";
values = news;
}
conn.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length) return res.status(StatusCodes.OK).json(results[0]);
else return res.status(StatusCodes.NOT_FOUND).end();
});
};
이때 sql 문 연결할때, where 문 앞에 공백을 만들지 않는다면, 이렇게 동작한다.
`sql: "SELECT * FROM booksWHERE category_id = '0'"`
//(요약된)전체 도서 조회 + 카테고리별 조회 + 신간 여부
페이징 paging
몇개씩 화면에 보여줄지 결정한다.
SELECT * FROM books LIMIT 3 OFFSET 0;
`LIMIT 출력할 행의 개수 OFFSET 시작컬럼`
> 간단하게! `LIMIT 0,3`
SELECT * FROM books LIMIT 0,3;
코드 구현
프론트엔드에서 LIMIT, OFFSET 숫자 전달 > n개씩 보냄 > url req에 담는다.
쿼리 스트링으로! `/books?limit={page당 도서 수}¤tPage={현재 page}`
limit, offset 기본으로 sql에 들어있어야 한다.
where ~ Limit 순서!
const allBooks = (req, res) => {
let { category_id, news, limit, currentPage } = req.query;
//lim,it : page 당 도서 수
//currnetPage : 현재 몇 페이지
//offset : 0부터 시작~ limit * (currnetPage-1)
let offset = limit * (currentPage - 1);
let sql = "SELECT * FROM books";
let values = [];
if (category_id && news) {
sql +=
" WHERE category_id=? and pub_date BETWEEN date_sub(now(), interval 6 month) AND now()";
values=[category_id];
} else if (category_id) {
sql += " WHERE category_id = ?";
values=[category_id];
} else if (news) {
sql +=
" WHERE pub_date BETWEEN date_sub(now(), interval 6 month) AND now()";
}
sql += " LIMIT ? OFFSET ?";
values.push(parseInt(limit), offset);
conn.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length) return res.status(StatusCodes.OK).json(results);
else return res.status(StatusCodes.NOT_FOUND).end();
});
};
☑️ 배운 점
이전 프로젝트에서는 데이터를 백엔드에서 전체정보를 한번에 넘겨줬었다. 그리고 프론트엔드에서 인덱스를 통해서 원하는만큼 끊어서 쓰라고 했어서 그런줄만 알았다... 그런데 백엔드에서 처리할 수 있는 방법이 있었다니...!!😢 신기했다.
쿼리스트링으로 url 을 전달할때 or body 값으로 그냥 전달할때를 잘 구분해서 api 설계하는 방법 이해하기!