이번에는 book과 category의 연관관계를 연결하고, join의 사용방법과 신간, 카테고리, 페이징을 설정하는 방법에 대해서 배웠다.
먼저 이전사간에 못한 books과 category 연관관계를 index를 통해 연결한다.

이제 join을 사용하면 books의 category_id와 category의 id를 한 테이블로 붙여서 볼 수 있다.

이렇게 만든 코드는 나중에 책의 개별 조회에서 category_id에 따른 name을 나타낼 때 사용할 거 같다.
as
데이터베이스에서 컬럼의 이름을 변경해줄때 as 사용하면 이름을 바꿀 수 있다는 것이다. 이렇게 바꾸게되면 아스카를 못써서 그냥 컬럼명 자체를 바꿔주는게 더 좋을 수도있다.
이렇게 바뀐 테이블들을 토대로 erd에 반영해줘야 한다.
앞에서 join으로 테이블을 붙였으니 이제 개별 도서목록에서 사용할 일만 남았다. 근데 아래와 같이 사용할 수는 없기에 수정해 준다.
SELECT * FROM books WHERE id=1 LEFT JOIN category ON books.category_id = category.id;
=>
SELECT * FROM books LEFT JOIN category ON books.category_id = category.id WHERE id=1;
아래부분 처럼 뒤에 WHERE을 추가해야줘야 밑의 사진처럼 category_name이 보인다.

데이터베이스에서 기준시간을 통해 앞뒤로 이동한 시간을 찾을 수 있다.
시간 더하기
DATE_ADD(기준날짜, INTERVAL __)
시간 뺴기
DATE_SUB(기준날짜, INTERVAL __)
시간 범위를 설정해서 SELECT
SELECT * FROM books WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 2 YEAR) AND NOW();

위의 시간을 조절해주는 명령어를 통해 도서에서 1달 전부터 현재까지 출시된 도서를 신간으로 보여줄 수 있다.
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 1 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 1 Month) AND NOW();";
values = [news]
}
db.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();
});
}
데이터베이스 페이징(pagein)
즉, 프론트에 얼마정도의 페이지를 보여줄지를 정할 수 있는 api를 작성해줄 것이다.
SELECT * FROM books LIMIT 4 OFFSET 8;
ㄴSELECT * FROM books LIMIT 8,4;
위의 명령어는 몇개(Limit)를 어디서(OFFSET)부터 보여줄 지 정할 수 있는 명령어 이다. 이걸 사용해서 프론트로부터 n개 보여줄꺼고, m페이지 를 보여줄꺼야 에 맞는 데이터만 보여줄 수 있다.
/books?limit=(당 도서수)¤tPage = (현재 page) sql += " LIMIT ?,?"
values.push(offset, parseInt(limit))
console.log(sql,values)다음은 1페이지에 4개의 데이터중 카테고리id가 0이고, 신간인 걸 보여달라는 요청에 대한 api와 데이터이다.
