위 처럼 주소가 들어있는 테이블 에서 "adr" 컬럼의 내용 중 "을지로" 가 포함되는 결과만 출력 하려면 어떻게 할까요?
보통은 아래처럼 SELECT LIKE '%검색어%' 쿼리를 사용 하는것이 일반적 입니다.
// 주소정보 조회 쿼리 $search = '을지로'; $stmt = DB::getInstance()->query("SELECT code, adr FROM roadcode WHERE adr LIKE '%$search%'"); $raw_list = $stmt->fetchAll();
만약 수백~수천번 반복되는 반복문 안에서 매번 SELECT LIKE 쿼리를 날려줘야 하는 경우에는 부하가 늘어나고 출력이 느려질것 이므로 최초 로드시 한번만 SELECT 쿼리를 실행하여 배열에 저장해두고, 필요할때 마다 특정 배열 값을 LIKE 처럼 확인하여 추출하는것이 서버 부하도 줄이고 효율적이라고 생각하여 작성한 팁 입니다.
다만, 선행 조건은 DB에서 최초 데이터를 받아 올때 WHERE 절을 이용하여 필요한 데이터만 1차 필터링 해주거나
혹은 배열상에서 1차 필터링 하여 필요한 배열값만 남겨 주어야 합니다.
원본 배열의 개수가 너무 많다면 오히려 매번 LIKE 쿼리를 날리는것 보다 더 느려질 수 있습니다 ㅠㅠ
예를들어 "서울특별시 중구" 의 하위주소인 "을지로" 를 문자열검색(LIKE) 을 이용하여 반복해서 찾아야 할 필요가 있다면
배열에 "서울특별시 중구" 가 포함되는 값들만 필터링 하여 1차 저장하고 그 하위 주소에 해당하는 값들을 검색할 때에 DB쿼리를 하지 않고 페이지 로드시 1차저장 해두었던 배열에서 바로 검색하여 처리하는 방법 입니다.
// 주소정보 조회 쿼리 $search = '서울특별시 중구'; $stmt = DB::getInstance()->query("SELECT code, adr FROM roadcode WHERE adr LIKE '%$search%'");"); $raw_list = $stmt->fetchAll(); // arrayLikeVal($raw_list, '검색대상컬럼명', '검색어'); $filter_list = arrayLikeVal($raw_list, 'adr', '을지로'); // [함수] 2차원배열 특정 값 LIKE 검색 function arrayLikeVal($array, $target, $search) { $res = array(); foreach($array as $val) { if (strpos($val->$target, $search) !== false) { array_push($res, $val); } } return $res; }
사용은 arrayLikeVal($raw_list, 'adr', '을지로') 앞에서 부터 순서대로 배열명, 컬럼명, 검색어 순으로 입력하시면 됩니다.
$변수 형태로 넣거나 따옴표로 감싸서 직접 값을 넘겨주시면 됩니다.
이렇게 $배열명->컬럼명 값에 검색어가 포함되는 결과만 필터링 되어 리턴 됩니다 ~
아마도 고수님들 께서는 더 효율적이고 쉬운 방법으로 처리 하실지도 모르겠지만
그동안 XETOWN에서 너무나도 많은 도움과 조언을 받아 왔기에..
혹시 누군가 저처럼 절실하게 이 내용을 필요로 하여 찾지는 않을까 하여 이렇게 팁을 작성 해봅니다 ^ㅡ^
항상 감사드립니다. 저 또한 팁으로 작성할만한 내용이 있다면 또 작성토록 해보겠습니다!!
흥미로운 방법이네요.
그런데 사실상 풀스캔을 한다는 점에서 LIKE 쿼리와 근본적으로 다른 점이 없어서...
LIKE 쿼리를 하는 것과 속도를 한 번 비교해 보면 재미있을 것 같습니다. ㅎㅎ