home강의 홈으로
Section 5. MySQL 활용 웹사이트 만들기
Lesson 2. 필터와 정렬 기능 만들기

1. 단순 필터링 구현

/views/biz-simple.hbs

<h1>{{ title }}</h1> <a href="/biz-adv?section=&floor=&status=&order="> 고급 화면으로 보기 ▶️ </a> <br><br> <table> <thead> <tr> <th>업소명</th> <th>섹션</th> <th>층</th> <th>상태</th> <th>배달</th> <th></th> </tr> </thead> <tbody> {{#each businesses}} <tr> <td>{{business_name}}</td> <td>{{section_name}}</td> <td>{{floor}}</td> <td>{{status_kor}}</td> <td> {{#if can_takeout}} ✔️ {{^}} ❌ {{/if}} </td> <td> <a href="/business/{{ business_id }}"> 자세히 </a> </td> </tr> {{/each}} </tbody> </table> <br><br> <a href="/"> ◀️ 섹션 목록으로 돌아가기️ </a>

/database/sql.js

getBusinessesJoined : async (query) => { const sqlQuery = ` SELECT * FROM sections S LEFT JOIN businesses B ON S.section_id = B.fk_section_id WHERE TRUE ${query.section ? ('AND section_id = ' + query.section) : ''} ${query.floor ? ('AND floor = ' + query.floor) : ''} ${query.status ? ("AND status = '" + query.status + "'") : ''} ORDER BY ${query.order ? query.order : 'business_id'} ` console.log(sqlQuery) const [rows] = await promisePool.query(sqlQuery) return rows },

/routes/index.js

const statusKorMap = { OPN: '영업중', CLS: '폐업', VCT: '휴가중', RMD: '리모델링' } router.get('/biz-simple', async function(req, res, next) { const businesses = await sql.getBusinessesJoined(req.query) businesses.map((item) => { item.status_kor = statusKorMap[item.status] return item }) res.render('biz-simple', { title: '단순 식당 목록', businesses }); });

🚀 localhost:3000에서 섹션을 선택해보세요!




2. 고급 필터링 구현

/views/biz-adv.hbs

<h1>{{ title }}</h1> <a href="/biz-simple?section={{ q.section }}"> 단순 화면으로 보기 ▶️ </a> <br><br> <form action="/biz-adv"> <select name="section"> <option value="">전체 섹션</option> <option value="1">한식</option> <option value="2">분식</option> <option value="3">중식</option> <option value="4">일식</option> <option value="5">양식</option> <option value="6">카페</option> <option value="7">카페</option> </select> <select name="floor"> <option value="">전체 층</option> <option value="1">1층</option> <option value="2">2층</option> <option value="3">3층</option> </select> <select name="status"> <option value="">전체 상태</option> <option value="OPN">영업중</option> <option value="VCT">휴가중</option> <option value="RMD">리모델링</option> <option value="CLS">폐업</option> </select> <select name="order"> <option value="">식당 ID</option> <option value="section_name">섹션</option> <option value="floor">층</option> </select> <input type="submit" value="검색"> </form> <br> <table> <thead> <tr> <th>업소명</th> <th>섹션</th> <th>층</th> <th>상태</th> <th>배달</th> <th></th> </tr> </thead> <tbody> {{#each businesses}} <tr> <td>{{business_name}}</td> <td>{{section_name}}</td> <td>{{floor}}</td> <td>{{status_kor}}</td> <td> {{#if can_takeout}} ✔️ {{^}} ❌ {{/if}} </td> <td> <a href="/business/{{ business_id }}"> 자세히 </a> </td> </tr> {{/each}} </tbody> </table> <br><br> <a href="/"> ◀️ 섹션 목록으로 돌아가기️ </a>

/routes/index.js

router.get('/biz-adv', async function(req, res, next) { const businesses = await sql.getBusinessesJoined(req.query) businesses.map((item) => { item.status_kor = statusKorMap[item.status] return item }) res.render('biz-adv', { title: '고급 식당 목록', q: req.query, businesses }); });

🤔얄코에게 질문하기질문은 반.드.시 이리로 보내주세요! ( 강의사이트 질문기능 ✖ )

강의에서 이해가 안 되거나 실습상 문제가 있는 부분,
설명이 잘못되었거나 미흡한 부분을 메일로 알려주세요!

답변드린 뒤 필요할 경우 본 페이지에
관련 내용을 추가/수정하도록 하겠습니다.

이메일 주소
yalco@yalco.kr
메일 제목 (반드시 아래 제목을 붙여넣어주세요!)
[질문] 조금 더 깊은 MySQL 5-2

🛑질문 전 필독!!

  • 구글링을 먼저 해 주세요. 들어오는 질문의 절반 이상은 구글에 검색해 보면 1분 이내로 답을 찾을 수 있는 내용들입니다.
  • 오류 메시지가 있을 경우 이를 구글에 복붙해서 검색해보면 대부분 짧은 시간 내 해결방법을 찾을 수 있습니다.
  • 강의 페이지에 추가사항 등 놓친 부분이 없는지 확인해주세요. 자주 들어오는 질문은 페이지에 추가사항으로 업데이트됩니다.
  • "유료파트의 강의페이지는 어디 있나요?" - 각 영상의 시작부분 검은 화면마다 해당 챕터의 강의페이지 링크가 있습니다.
  • 질문을 보내주실 때는 문제가 어떻게 발생했고 어떤 상황인지 등을 구체적으로 적어주세요. 스크린샷을 첨부해주시면 더욱 좋습니다.
🌏 Why not change the world?