묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
mysql에서 조건식 질문 드립니다.
2003.07.24 00:08
$query = "SELECT * FROM 자료실정보 WHERE 가기코드="$mogocode" and 제목 LIKE '%$sortname%'";
오늘 하루종일 고생만하다가 답이 안나와서 이렇게 들렸습니다.
제가 질문드릴 부분은 위의 내용에 있습니다.
우선 가장 중요한 질문은 위의 where 조건에서 가기코드 필드가
$mogocode 라고 정의되어 있죠?
그런데 사실 $mogocode가 하나가 아니라
$mogocode[1] 부터 $mogocode[10]까지 있습니다.
이걸 따로따로 쿼리문을 열려면 너무 서버에 부하가 많이 걸리고
나중에 자료의 유용성도 떨어져서... 어떻게.. 한 방에
해결할 수 있는 방법은 없을까요?
예를 들어,
$mogocode[1]="pds";
$mogocode[2="bbs";
.
.
.
위와 같이 정의되어 있다고 한다면 $mogocode[] 라고만 해도
될런지..(사실은 안됐음..)
고수님들의 특별한 조언 부탁드릴께요.
그리고 두 번째 질무은
예전에 봤던 글에서는 제목 LIKE '%$sortname%'
이와 같이 할 경우 서버에 부하를 가중시킨다고 하더군요
혹시 서버에 부하를 덜 주는 다른 방법은 없을까요?
조언 부탁드릴께요...
오늘 하루종일 고생만하다가 답이 안나와서 이렇게 들렸습니다.
제가 질문드릴 부분은 위의 내용에 있습니다.
우선 가장 중요한 질문은 위의 where 조건에서 가기코드 필드가
$mogocode 라고 정의되어 있죠?
그런데 사실 $mogocode가 하나가 아니라
$mogocode[1] 부터 $mogocode[10]까지 있습니다.
이걸 따로따로 쿼리문을 열려면 너무 서버에 부하가 많이 걸리고
나중에 자료의 유용성도 떨어져서... 어떻게.. 한 방에
해결할 수 있는 방법은 없을까요?
예를 들어,
$mogocode[1]="pds";
$mogocode[2="bbs";
.
.
.
위와 같이 정의되어 있다고 한다면 $mogocode[] 라고만 해도
될런지..(사실은 안됐음..)
고수님들의 특별한 조언 부탁드릴께요.
그리고 두 번째 질무은
예전에 봤던 글에서는 제목 LIKE '%$sortname%'
이와 같이 할 경우 서버에 부하를 가중시킨다고 하더군요
혹시 서버에 부하를 덜 주는 다른 방법은 없을까요?
조언 부탁드릴께요...
댓글 3
-
토끼군
2003.07.24 14:44
-
토끼군
2003.07.24 14:44
생각해 보니 postscript in answer 1의 ksort 함수는 왜 썼는 지 모르겠습니다. -_-;; -
한승진
2003.07.24 17:56
우와~~ 정말정말 감사드립니다.
방금 성공 했구요.
한 편의 강의를 듣는듯한 기분~!
$_mogocode = "(가기코드 in ('" . implode("', '", $mogocode) . "'))";
$query = "SELECT * FROM 자료실정보 WHERE $_mogocode and instr(제목, '$sortname');";
설명 시작합니다.
Answer 1.
MySQL 문서를 잘 뒤지시다 보면 in이라는 연산자를 볼 수 있습니다. 이 놈의 사용법은...
-- <expr> in (<element1>, <element2>, ..., <elementN>)
이렇게 씁니다. 이게 뭔 말이냐 하면, <expr>라는 식의 값이 <element1>, <element2>, ..., <elementN>에 포함되어 있으면 1을 반환합니다. (아니라면 당연히 0을 반환하겠지요...)
따라서 다음 식의 값은 1입니다.
-- 'tokigun' in ('toki', 'babo', 'tokigun', 'brueak!')
하지만 다음 식의 값은 0입니다.
-- 7 in (3, 4, 6, 9)
1은 참으로 인식되는 숫자이므로, 그냥 and 연산자로 쭉 이어 줘도 별 문제는 없겠지요. :-)
Postscript in Answer 1.
implode 함수에 대해서 잠깐 설명해 봅시다. 이 함수는 배열의 값들 사이사이에 지정한 문자열을 끼워 넣어서 문자열로 만드는 함수입니다. 사용법은 다음과 같습니다.
-- implode(<string>, <array>)
다음 문장은 "산토끼 토끼야 어디를 가느냐"를 출력합니다.
-- echo implode(" ", array("산토끼", 7=>"토끼야", "abc"=>"어디를", "가느냐"));
이 때 키 값은 아무 역할도 하지 않습니다. 아무 정렬도 하지 않고 배열이 입력된 순서대로 출력됩니다. 혹시나 $mogocode 배열이 키 값 순서대로 입력되지 않은 것 같다면, ksort($mogocode); 명령으로 한방에 정렬할 수 있습니다.
* 혹시 $mogocode에 $mogocode[1], ..., $mogocode[10] 말고 다른 값도 들어 있다면 대략 낭패입니다. -_-; 그럴 때는 for이나 foreach 문으로 한 번 돌려 주어야 합니다. (뭐 다른 방법도 있지만)
Answer 2.
네. like는 서버에 상당한 부하를 줍니다. =_= 그래서 다음과 같은 함수들을 쓰지요.
-- instr(<string>, <pattern>)
-- locate(<pattern>, <string>)
-- locate(<pattern> in <string>)
이 세 함수 모두 <string>에 <pattern>이라는 문자열이 들어 가 있으면 0보다 큰 수를 반환합니다. (아니면 당연히 0이겠지요...)
좀 더 자세히 말하자면, <string>에서 <pattern>이라는 문자열이 처음으로 나오는 위치를 반환합니다. 예를 들어서 다음 예는 3을 반환합니다. (첫 글자가 1이라는 걸 쉽게 알 수 있습니다)
-- instr('##tokiTOKItoki##', 'toki')
뭐 우리는 있는 지 없는 지만 확인하므로, 문자열이 들어 가 있으면 0보다 큰 수를 반환하고, 이 숫자들은 참으로 인식되므로 그냥 써도 되겠습니다.
- 토끼군