πŸ“ 검색필터 μ„€μ •

10_2pangΒ·2023λ…„ 6μ›” 26일
0

βš½οΈνŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
73/94
post-thumbnail

πŸ‘¨β€πŸ’»Β μ‚¬κ±΄


MySQL 쿼리문을 ν†΅ν•˜μ—¬, filter 처리 ( 각 ν•­λͺ©λ³„ μ˜€λ¦„μ°¨μˆœ,λ‚΄λ¦Όμ°¨μˆœ 정리 ) ν•˜λ €κ³  ν•˜μ˜€λ‹€.

μš°μ„ , λ‚΄κ°€ ν•„ν„°λ₯Ό μ μš©μ‹œν‚€κΈ°μœ„ν•΄ ν•œ 생각이닀.

  1. κ°€μž₯ μ²«νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν• λ•ŒλŠ” ν˜„μž¬λŠ₯λ ₯치(ca) κ°€ λ†’μ€μˆœμœΌλ‘œ νŽ˜μ΄μ§€ λ‘œλ“œλ₯Ό ν•œλ‹€.

  2. ν•­λͺ©μ„ ν΄λ¦­ν•˜λ©΄, filterλ₯Ό μ μš©ν•  ν•„λ“œμ˜ 슀트링 값을 쿼리문에 ν¬ν•¨ν•˜κ³ , μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 정리할지 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 정리할지 κ²°μ •ν•œλ‹€. (μ΄ˆκΈ°λŠ” DESC 이고, 클릭을 ν•˜λ©΄, ASC 둜 μ •λ ¬ )

  3. μ›ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό λ‘œλ”©ν•œλ‹€.

쑰건문을 ν™œμš©ν•˜μ—¬, μ›ν•˜λŠ” 쿼리문을 μ μš©μ‹œν‚¨λ‹€.
λ˜ν•œ 'Date of birth' 와 'Values_column' 처럼 νŠΉμˆ˜λ¬Έμžλ‚˜ 띄어쓰기λ₯Ό ν•œ μΏΌλ¦¬λŠ” λ”°λ‘œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

βœ…Β ν•΄κ²°


μˆœμ„œλŒ€λ‘œ 처리λ₯Ό ν•˜μ—¬, 문제λ₯Ό ν•΄κ²°ν•˜μ˜€λ‹€.

λ¨Όμ € Seach page 의 μ½”λ“œμ΄λ‹€.

// useState λ₯Ό ν†΅ν•˜μ—¬, μƒνƒœκ΄€λ¦¬
const [verify, setVerify] = useState(initialVerify)
const [filter, setFilter] = useState(initialFilter)

//ν˜„μž¬ filter의 κ°’κ³Ό, ν΄λ¦­ν•œ filter의 값이 μΌμΉ˜ν•˜λ©΄ verify 값을 μ „ν™˜ν•œλ‹€. κ·Έν›„, filter 값을 μ„ νƒν•œ ν•„ν„°κ°’μœΌλ‘œ μ—…λ°μ΄νŠΈν•œλ‹€.
const handleFilterChange = (newFilter) => {
  if (filter === newFilter) {
    setVerify(!verify)
  } else {
    setVerify(true)
  }
  setFilter(newFilter)
}

// 각 ν•­λͺ©μ„ ν΄λ¦­ν–ˆμ„κ²½μš°, μœ„μ˜ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
<th onClick={() => handleFilterChange('ca')}>ν˜„μž¬λŠ₯λ ₯</th>
<th onClick={() => handleFilterChange('pa_converted')}>μ΅œλŒ€ 잠재λŠ₯λ ₯</th>
<th onClick={() => handleFilterChange('Date of birth')}>생일</th>
<th onClick={() => handleFilterChange('Name')}>이름</th>
<th onClick={() => handleFilterChange('Values_column')}>κ°€μΉ˜</th>
<th onClick={() => handleFilterChange('Salary')}>κΈ‰μ—¬</th>

이제 μ΄λ ‡κ²Œ μƒνƒœκ΄€λ¦¬ν•œ 값을 ν΄λ¦­ν• λ•Œλ§ˆλ‹€, useEffect 둜 λ¦¬νŒ¨μΉ­μ„ ν•œλ‹€.

μ•„λž˜λŠ” 쿼리문을 μž‘μ„±ν•œ μ½”λ“œμ΄λ‹€.(API)

// filter 값이 req 둜 λ„˜μ–΄μ˜¨κ²ƒμ΄ μžˆλ‹€λ©΄ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κ³  μ•„λ‹κ²½μš° μ΄ˆκΈ°κ°’μœΌλ‘œ ν˜„μž¬λŠ₯λ ₯치(ca) κ°’μœΌλ‘œ μ„€μ •ν•œλ‹€.
let filter = req.query.filter ? req.query.filter : 'ca'

// verify 값이 true 일 κ²½μš°μ—λŠ” λ‚΄λ¦Όμ°¨μˆœ, μ•„λ‹κ²½μš°μ—λŠ” μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ„ΈνŒ…ν•œλ‹€.
const verify = req.query.verify === 'true' ? 'DESC' : 'ASC'

// 띄어쓰기 ν˜Ήμ€ νŠΉμˆ˜λ¬Έμžκ°€ μžˆλŠ” filter의 경우 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ€€λ‹€. κ·Έλž˜μ•Ό μ œλŒ€λ‘œ 쿼리가 μž‘λ™ν•œλ‹€.
if (filter === 'Date of birth' || filter === 'Values_column') {
  filter = `\`${filter}\``
}


const query = `SELECT *, 
// 잠재λŠ₯λ ₯ κ°™μ€κ²½μš°, λžœλ€ν¬ν…μ΄ μ„žμ—¬μžˆμ–΄ μ•„λž˜μ™€ 같이 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ€˜μ•Όν•œλ‹€.
CASE
  WHEN pa < -10 THEN pa * -2
  WHEN pa < 0 THEN pa * -20
  ELSE pa
END AS pa_converted ,
// Not For Sale 인 μ„ μˆ˜λ“€μ˜ λͺΈκ°’이 347975206 둜 λ˜μ–΄μžˆμ–΄μ„œ, -1 둜 λ§Œλ“€μ—ˆλ‹€. 
// Search νŽ˜μ΄μ§€μ—μ„œ κ°€μΉ˜κ°€ -1 인 값은 "Not For Sale" 둜 λ Œλ”λ₯Ό ν•˜κΈ°μœ„ν•΄μ„œ -1 둜 μ²˜λ¦¬ν–ˆλ‹€. 
// ( μ˜€λ¦„,λ‚΄λ¦Ό μ°¨μˆœλ„ κ³ λ €ν•œ νŒλ‹¨μ΄λ‹€.)
CASE
  WHEN Values_column = 347975206 THEN -1
  ELSE Values_column
  END AS Values_column FROM fm_table ORDER BY ${filter} ${verify} LIMIT ${limit} OFFSET ${offset}`

connection.query(query, (err, result) => { ...

μœ„μ²˜λŸΌ, μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ‹ˆ μ›ν•˜λŠ” 값에 λ„μΆœν• μˆ˜μžˆμ—ˆλ‹€.

πŸ’­Β κ°œμ„ 


  • 이제, filter λŠ” μ μš©ν–ˆμœΌλ‹ˆ, input 값에 λ§žλŠ” μ„ μˆ˜λ₯Ό λ½‘μ•„λ‚Όμˆ˜μžˆλ„λ‘ 섀정해봐야겠닀.
profile
μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 이광렬 μž…λ‹ˆλ‹€ 🌸

0개의 λŒ“κΈ€