Tiny Bunny

๐Ÿ”— books & category ์—ฐ๊ด€๊ด€๊ณ„ ์„ค์ •

๋„์„œ ์กฐํšŒํ•  ๋•Œ ์นดํ…Œ๊ณ ๋ฆฌ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•˜์—ฌ ์นดํ…Œ๊ณ ๋ฆฌ๋ช…์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก FK ์„ค์ •

  • Foreign Key Name : ์—ฐ๊ด€๊ด€๊ณ„๋ช…
  • Referenced Table : ์—ฐ๊ฒฐํ•  ํ…Œ์ด๋ธ”
  • Column : ํ˜„์žฌ ์„ ํƒ๋œ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ์ค‘ FK๋กœ ์„ค์ •ํ•  ์ปฌ๋Ÿผ
  • Referenced Column : Referenced Table์˜ ์ปฌ๋Ÿผ ์ค‘ ์—ฐ๊ฒฐํ•  ์ปฌ๋Ÿผ ์„ ํƒ

์ด์ œ books์˜ ์นดํ…Œ๊ณ ๋ฆฌ id๊ฐ’๊ณผ category์˜ id๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ์กฐ์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

* ์ปฌ๋Ÿผ๋ช…๋งŒ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด category์˜ name ์ปฌ๋Ÿผ์„ category_name์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค. 

 

let sql = `SELECT * FROM books LEFT JOIN category 
           ON books.category_id = category.id WHERE books.id=?`;

 

์ฝ”๋“œ์—๋„ JOIN๋ฌธ์„ ์ ์šฉํ•ด์ฃผ๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ๋ช…๊นŒ์ง€ ์ž˜ ์ถœ๋ ฅ๋œ๋‹ค. 

 

โฐ SQL ์‹œ๊ฐ„ ๋ฒ”์œ„ 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹œ๊ฐ„์˜ ๋ฒ”์œ„๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

1. ์‹œ๊ฐ„ ๋”ํ•˜๊ธฐ (์ดํ›„)

DATE_ADD(๊ธฐ์ค€๋‚ ์งœ, INTERVAL ๊ฐ„๊ฒฉ)

 

 

2. ์‹œ๊ฐ„ ๋นผ๊ธฐ (์ด์ „)

DATE_SUB(๊ธฐ์ค€๋‚ ์งœ, INTERVAL ๊ฐ„๊ฒฉ)

 

๊ธฐ์ค€ ๋‚ ์งœ๋ฅผ NOW()๋กœ ์„ค์ •ํ•˜๋ฉด ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก์•„์ค€๋‹ค. 

 

๊ทธ๋Ÿผ ํ•œ ๋‹ฌ์ด๋‚ด ์ถœ๊ฐ„๋œ ๋„์„œ๋ฅผ ์‹ ๊ฐ„์ด๋ผ ํ•  ๋•Œ, ์‹ ๊ฐ„์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SELECT * FROM books 
WHERE pub_date 
BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) 
AND NOW();
  • pub_date๊ฐ€ ํ•œ ๋‹ฌ ์ „๋ถ€ํ„ฐ ํ˜„์žฌ ์‚ฌ์ด์ธ ๋„์„œ๋ฅผ ์กฐํšŒ

์‹คํ–‰ ์‹œ์ (NOW) : 2025-03-14

 

๐Ÿ“š ์นดํ…Œ๊ณ ๋ฆฌ, ์‹ ๊ฐ„ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋„์„œ ๋ชฉ๋ก ์กฐํšŒ

SELECT * FROM books 
WHERE category_id = 0 AND
pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH)  AND NOW();

SQL๋ฌธ์—์„œ WHERE์ ˆ์— ์กฐ๊ฑด ๋‘ ๊ฐœ๋ฅผ ์“ฐ๋ ค๋ฉด AND ์‚ฌ์šฉํ•ด ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๐Ÿ“ƒ ๋„์„œ ๋ชฉ๋ก ์กฐํšŒ ํŽ˜์ด์ง• 

ํŽ˜์ด์ง• (paging)

: ๋ช‡ ๊ฐœ์”ฉ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ๊ฐ€, ์ฆ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ์„œ ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋งŒํผ ์”ฉ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ 

 

์›๋ž˜ SELECT ์‹คํ–‰ ์‹œ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

SELECT * FROM books LIMIT ์ˆซ์ž OFFSET ์ˆซ์ž;
  • LIMIT : ์ถœ๋ ฅํ•  ํ–‰์˜ ์ˆ˜
  • OFFSET : ์‹œ์ž‘ ์ง€์  ( = ๋‚ด๊ฐ€ ์ง€๊ธˆ ๋ช‡ ํŽ˜์ด์ง€๋”๋ผ?)
    • ์œ„ ์‚ฌ์ง„ ์† ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ฉด ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์˜ id๋Š” 1์ด์ง€๋งŒ ์ด๊ฑด ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๊ฐ’
    • ์ฒซ ๋ฒˆ์งธ ์ค„์€ ํ•ญ์ƒ 0๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ! 

 

SELECT * FROM books LIMIT 4 OFFSET 8;
SELECT * FROM books LIMIT 8, 4;

์ด ์ฒ˜๋Ÿผ ์ค„์—ฌ์„œ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋‹จ, ์•„๋ž˜์ค„์ฒ˜๋Ÿผ ์ค„์—ฌ์„œ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” OFFSET๊ฐ’์ด ๋จผ์ € ์˜จ๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ ํ”„๋ก ํŠธ์—์„œ ๋ช‡ ๊ฐœ์”ฉ, ์–ด๋””์„œ๋ถ€ํ„ฐ ๋ฐ›์„ ๊ฒƒ์ธ์ง€ ์š”์ฒญํ•˜๋„๋ก ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฐ๋ฐ OFFSET๊ฐ’์„ ์ง์ ‘ ๋ฐ›๊ธฐ๋ณด๋‹จ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์•„์„œ ๋ฐฑ์—์„œ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ํŽธ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

์–ด๋–ป๊ฒŒ?

 

offset = limit * (currentPage - 1) 

 

์š”๋ ‡๊ฒŒ 

 

์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด limit๊ณผ currentPage ๊ฐ’์„ ๋ฐ›์•„์˜ค๊ธด ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ›์•„์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

SQL๋ฌธ์— ์ˆซ์ž ๋Œ€์‹  ๋ฌธ์ž์—ด๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 

let values = [parseInt(limit), offset];

์™œ offset์€ ์•ˆ๋ฐ”๊ฟ”์คฌ๋ƒ?

์•ž์—์„œ ์ˆ˜์‹์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ค€ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์•Œ์•„์„œ ํ˜•๋ณ€ํ™˜์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

์ด์ œ ๋ฐ์ดํ„ฐ๋“ค์ด ํŽ˜์ด์ง•๋˜์–ด ์ž˜ ์ถœ๋ ฅ๋œ๋‹ค.

 

๐ŸŒŸ LIMIT OFFSET๋ฌธ์ด WHERE์ ˆ ์•ž์œผ๋กœ ๊ฐ€๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ๋ฐ˜๋“œ์‹œ WHERE์ ˆ ๋’ค์— ์ž‘์„ฑ.

 

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];
} 
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()';
}

sql += ' LIMIT ? OFFSET ?';
values.push(parseInt(limit), offset);

 

์‹ ๊ฐ„์„ ํŽ˜์ด์ง•ํ•˜์—ฌ ์ถœ๋ ฅ

 

์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ์‹ ๊ฐ„์„ ํŽ˜์ด์ง•ํ•˜์—ฌ ์ถœ๋ ฅ

๋ฏผ๋ฆฌ๋ฒ„