MySQL strcmp(), REGEXP

nowkim·2021년 8월 14일
3

db

목록 보기
2/2

What to Do?

전체 과목에 대한 정보에서 필요한 요일, 필요한 시간대의 과목이 무엇인지 검색하기 위해 검색 옵션을 추가해야 한다.

요일검색옵션과 시간검색옵션이 필요하다.

예상 시나리오

사용자는 원하는 시간대에 과목이 있는지 확인하기 위해서 검색을 시도한다.

ex) 월요일 09:00~12:00 사이 과목 검색

→ 월 09:00~10:15 , 10:30~11:45 과목
→ 월,화 09:00~10:15 , 10:30~11:45 과목
→ 월,수 09:00~10:15 , 10:30~11:45 과목
→ 월,목 09:00~10:15 , 10:30~11:45 과목
→ 월, 금 09:00~10:15 , 10:30~11:45 과목
→ 월, 화, 수 09:00~10:15 , 10:30~11:45 과목
...

요일은 해당 요일이 포함되는 모든 과목을 return해야 하고,

시간은 해당 시간대에 속하는 과목만 return해야 한다.

참고 ref :
[MySQL] STRCMP - 문자열 비교
[MySQL] 특정 문자포함 검색 (LIKE & REGEXP)

Step 1. 시간 필터링

sol) strcmp()을 이용하여 시간을 비교해서 원하는 값을 찾자.

strcmp(exp1,exp2)return
exp1 = exp20
exp1 > exp21
exp1 < exp2-1

예상 시나리오:
사용자가 09:00~12:00 사이의 과목을 조회하고 싶다.

  • 09:00~10:15
  • 10:30~11:45
  • 09:00~11:45
    에 해당하는 과목들을 return 1로 해야 한다.

# 시작시간1은 db상에서 과목의 시작시간이 있는 column이다.

strcmp(시작시간1,input)

⇒ return이 1일 경우 시작시간1이 더 큰 것이므로 09:00보다 크다.
⇒ return이 0일 경우 시작시간이1과 input이 같으므로 종료시간만 input 종료시간보다 일찍이기만 하면 된다.
⇒ return이 -1일 경우 그냥 배제.

strcmp(input, 종료시간1)

⇒ return이 1일 경우 input이 종료시간1보다 큰 것이므로 12:00보다 일찍 끝나는 수업이다. 성립!
⇒ return이 0일 경우 input과 종료시간이 같으므로 조건에 성립.
⇒ return이 -1일 경우 배제.

결론

# 수도코드
if strcmp(시작시간1,input시작시간) >= 0 :
	if strcmp(input종료시간, 종료시간1) >= 0:
		#우리가 찾는 값
# 실제 sql 코드
select * from s18_1_t
where strcmp(시작시간1,'09:00') >= 0 
and strcmp('12:00',종료시간1) >= 0
# 시작시간, 종료시간이 09:00~12:00 사이인 과목 찾음

strcmp 결과
예쁘게 잘 나왔다.

요일 필터링

REGEXP 를 이용해서 원하는 값 찾기

첫 시도는 like 연산자였다.

그러나 like의 경우 복수개의 특정 문자열이 있는지 체크하려면 or 로 계속 묶어나가야 했기에, 너무 길어지는 문제점이 있었다. 해결책으로

REGEXP 을 사용하게 되었다. 사용법은 다음과 같다.

REGEXP 연산자는 LIKE보다 복잡한 패턴을 검색 할때 사용한다.

  • 복수개의 특정 문자를 포함하는 데이터 검색
    (특정 문자열을 '|' 를 기준으로 나눈다)
SELECT [필드명] FROM [테이블명] 
WHERE [필드명] REGEXP '특정 문자열|특정 문자열2';

적용

월요일이 포함된 모든 값 리턴.
REGEXP '월'

월 또는 화요일이 포함된 모든 과목 리턴.
REGEXP '월|화'

최종

이제 이 둘을 조합할 때이다.
REGEXP,strcmp() 조합

월요일 수업이 생각보다 정말 별로 없네요..?

뭐 어쨌든 끝!

profile
끙끙대며 배우는 중 - [https://typednow.com] 으로 이전

0개의 댓글