전체 과목에 대한 정보에서 필요한 요일, 필요한 시간대의 과목이 무엇인지 검색하기 위해 검색 옵션을 추가해야 한다.
요일검색옵션과 시간검색옵션이 필요하다.
사용자는 원하는 시간대에 과목이 있는지 확인하기 위해서 검색을 시도한다.
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)
strcmp(exp1,exp2) | return |
---|---|
exp1 = exp2 | 0 |
exp1 > exp2 | 1 |
exp1 < exp2 | -1 |
예상 시나리오:
사용자가 09:00~12:00 사이의 과목을 조회하고 싶다.
# 시작시간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 사이인 과목 찾음
예쁘게 잘 나왔다.
첫 시도는 like 연산자였다.
그러나 like의 경우 복수개의 특정 문자열이 있는지 체크하려면 or 로 계속 묶어나가야 했기에, 너무 길어지는 문제점이 있었다. 해결책으로
REGEXP
을 사용하게 되었다. 사용법은 다음과 같다.
REGEXP 연산자는 LIKE보다 복잡한 패턴을 검색 할때 사용한다.
- 복수개의 특정 문자를 포함하는 데이터 검색
(특정 문자열을 '|' 를 기준으로 나눈다)SELECT [필드명] FROM [테이블명] WHERE [필드명] REGEXP '특정 문자열|특정 문자열2';
월요일이 포함된 모든 값 리턴.
월 또는 화요일이 포함된 모든 과목 리턴.
이제 이 둘을 조합할 때이다.
월요일 수업이 생각보다 정말 별로 없네요..?
뭐 어쨌든 끝!