검색 쿼리입니다. 한번 봐주세요
본문
select distinct wr_parent from g5_write_board where ((INSTR(wr_1, '스')) ) and (wr_num between -3 and (-3 + 0)) order by wr_num, wr_reply limit 0, 10
wr_1에서 "스"를 검색했을때 나오는 결과가 이상해서 쿼리를 찍어 보았습니다.
위 쿼리가 맞나요?
distinct 가 나오면 안되지 않나요?
그러니까 한개만 나오는거 같은데 아닌가요?
또 (wr_num between -3 and (-3 + 0))는 어떤의미인가요?
조언을 부탁드립니다.
답변 2
검색결과 부모글의 wr_id로 잡아야해서 제목등해서 리스트화가 가능하니 distinct로 그룹화한다고 생각하시면 되고 원글만 조회하고자 하신다면 distinct를 빼고 where에 wr is comment = 0을 넣어주는 방법도 있습니다. 인덱스 잡기 나름이라 wr_num은 어드민 config설정에 검색 단위 설정값이 있습니다. 즉 테이블 전체가 아닌그 단위값에 맞춰 분활해서 검색하게 됩니다. Spt인가 그변수 따라가보시면 이해되실듯 합니다.
SELECT DISTINCT wr_parent
FROM g5_write_board
WHERE ((INSTR(wr_1, '스')))
AND (wr_num BETWEEN -3 AND (-3 + 0))
ORDER BY wr_num, wr_reply
LIMIT 0, 10;
1. SELECT DISTINCT wr_parent
-
g5_write_board
테이블에서wr_parent
컬럼만 뽑아옵니다. -
DISTINCT
키워드를 사용했기 때문에 중복된wr_parent
값은 제거합니다.
→ 즉, 같은 부모글 ID가 여러 개 있어도 한 번만 반환됨.
2. FROM g5_write_board
-
데이터를 조회할 대상 테이블은
g5_write_board
.
3. WHERE
조건
조건이 2개로 나뉘어 있어요:
a) INSTR(wr_1, '스')
-
wr_1
필드 안에'스'
라는 문자열이 포함되어 있는지 확인. -
INSTR(문자열, 찾을_문자열)
→ 포함되어 있으면 0보다 큰 값, 포함 안되면 0. -
여기서는 단순히 조건문에서 쓰였으므로,
wr_1
값에'스'
가 들어있는 행만 선택.
b) wr_num BETWEEN -3 AND (-3 + 0)
-
wr_num
컬럼 값이-3
이상-3
이하인 경우, 즉 wr_num = -3인 행만 선택.
→BETWEEN a AND b
는 inclusive(포함) 범위 조건이므로wr_num = -3
과 동일한 조건.
4. ORDER BY wr_num, wr_reply
-
먼저
wr_num
기준으로 오름차순 정렬 -
그 다음 같은
wr_num
내에서wr_reply
기준으로 정렬.
5. LIMIT 0, 10
-
정렬된 결과 중에서 처음 0번째부터 최대 10개의 레코드만 출력.
정리
이 쿼리는 게시판 테이블에서:
-
wr_1
컬럼 값에'스'
가 포함되어 있고 -
wr_num
값이 -3인 글을 찾은 뒤 -
같은 부모글 ID는 중복 없이
-
wr_num
→wr_reply
순으로 정렬하고 -
상위 10개의
wr_parent
ID만 출력하는 것.
실제 사용 예
그누보드(G5) 구조상:
-
wr_num
은 원글 그룹 번호 -
wr_parent
는 부모글 ID(원글의wr_id
) -
wr_reply
는 댓글이나 대댓글 순서
이걸로 미루어 보면,
특정 그룹 글 중에 wr_1
값에 '스'가 포함된 글들의 원글 ID 목록을 찾는 용도로 쓰인 거예요.