
도서 정보들을 한페이지에 다 불러오는 것은 불필요하기에 offset , limit , SQL_CALC_FOUND_ROWS , found_rows() 를 사용해서 pagination을 구현해 볼 예정이다.
SQL_CALC_FOUND_ROWS 이란?SELECT 명령어와 함께 사용되며 , LIMIT 을 사용해 조회되는 행의 수를 제한할 때, 제한 되지 않은 전체 결과의 수를 계산 하는데 사용된다.
즉 , LIMIT으로 인해 반환되는 실제 행 수와 관계없이 쿼리가 실행될 경우 반환될 수 있는 전체 행의 수를 알고 싶을 때 유용하다.
ex )
SELECT SQL_CALC_FOUND_ROWS * FROM books LIMIT 10;
SELECT FOUND_ROWS() 이란 ?가장 최근에 실행된 SQL_CALC_FOUND_ROWS가 포함된 SELECT 쿼리가 제한 없이 반환했을 때의 전체 행의 수를 반환한다.
쿼리로 부터 반환되는 행의 수를 제한하는 데 사용된다.
특정 위치 이후의 행부터 데이터를 가져오기 시작하는 지점을 지정하는데 사용된다.
ex)
SELECT * FROM users LIMIT 10 OFFSET 10;
+
SELECT * FROM users LIMIT 10, 10;이런 식으로 OFFSET을 생략하고 사용할수도 있다.
let { category_id, news, limit, currentPage } = req.query;
let offset = limit * (currentPage - 1);
SQL_CALC_FOUND_ROWS 추가하기let sql =
"SELECT SQL_CALC_FOUND_ROWS books.*, (SELECT COUNT(*) FROM likes WHERE books.id = likes.liked_book_id) AS likes FROM books LIMIT ? OFFSET ?";
// limit은 query에서 받아오므로 string값으로 오기에 parseInt로 변환해주기
let values = [parseInt(limit), offset]
SELECT 바로 뒤에 SQL_CALC_FOUND_ROWS 로 전체 책의 개수를 저장해준다. 그리고 받은 LIMIT과
계산한 OFFSET을 ?를 이용해서 변수로 받아준다.
conn.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length) allBooksRes.books = results;
else return res.status(StatusCodes.NOT_FOUND).end();
});
result 에 책 목록을 담아준다. 뒤에 추가적으로 pagination을 위한 정보를 받아줘야 하기에 변수에 담아주기만 한다.
found_rows() 로 저장해둔 값 가져오기 sql = "SELECT found_rows()";
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
let pagination = {};
pagination.currentPage = parseInt(currentPage);
pagination.totalCount = results[0]["found_rows()"];
allBooksRes.pagination = pagination;
return res.status(StatusCodes.OK).json(allBooksRes);
});
SELECT found_rows() 로 저장해둔 총 책의 개수를 가져와 totalCount 변수에 넣어준다.
넣어줄 때는 results값이 아래와 같이 오기때문에

results[0]["found_rows()"]; 위와 같이 넣어주었다 .
pagination 객체를 allBooksRes 에 넣어서 최종적으로 return 해주면

위와 같이 책들 목록이 limit수 에 맞게 제한되어 나오며 , pagination에 대한 정보도 함께 리턴이 되는 것을 볼 수 있다.