2009-09-21 7 views
3

여러 인수를 사용하여 MySQL에서 검색 쿼리를 생성하려고 시도하고 있는데 제대로 얻을 수 없습니다.다중 인수 MySQL 검색 쿼리 구성하기

양식에서 검색 인수를 받고이를 사용하여 동적으로 내 쿼리를 작성합니다.

내가 작업 정보가 포함 된 MySQL 데이터베이스가 : 여기

는 몇 가지 배경 정보입니다. 네 개의 열 내가 검색 할 수 있습니다 :

  1. 직위
  2. 작업 유형
  3. 작업 설명
  4. 작업 위치

작업 제목 :이 1-5 단어 직위의 직함. 입력 방식에 따라 다를 수 있습니다.

작업 유형 : 작업 유형에 대한 세 문자 코드입니다.

작업 설명 : 이것은 사용자가 검색 양식을 사용하여 검색하는 도시 또는 마을

입니다 :이 짧은 작업에 대한 설명과 의무

위치입니다. 검색 양식은 세 부분으로 구성됩니다. 두 개의 텍스트 필드, "키워드"및 "위치"; 약 20 개의 작업 유형을 나열하는 드롭 다운 상자가 있습니다. 이것은 그들이 직업 목록에 대한 세 문자 코드 중에서 선택할 수 있습니다.

이 세 섹션의 정보를 사용하여 데이터베이스를 검색하고 가장 정확한 레코드를 반환하고 싶습니다. 필자는 쿼리를 여러 번 반복 해 보았습니다. 관련없는 레코드를 많이 반환하거나 관련된 레코드를 충분히 반환하지 않았습니다. 나는 또한 양식의 일부를 공백으로 남겨 두는 사용자를 고려하지 못했습니다.

 
select * FROM my_jobs_table 
WHERE category = 'User specified job type' 
OR job_title LIKE 'User specified Job keyword' 
OR job_description LIKE 'User specified Job keyword ' 
OR location LIKE "% User Specified Job Location%" 

이 단지 나를 위해 작동하지 않습니다 :

나의 현재 쿼리는 다음과 같이 보입니다. 어떤 제안?

+0

작업 유형이 정수입니까? 그렇다면 쿼리에서 ''을 제거해야합니다. –

+0

Jonas, jobtype은 OP의 쿼리조차도 포함되지 않습니다. 그리고 그는 그것이 int가 아닌 3 글자 코드라고 분명히 말합니다. 게다가 mysql은 숫자 주위에 따옴표가 있는지 상관하지 않으므로 문제가되지 않습니다. –

+0

빅터, "작동하지 않는다"고 정의 할 수 있습니까? –

답변

3

다양한 "LIKE '%keyword%'"솔루션은 성능이 좋지 않습니다. 대신 FULLTEXT INDEX을 사용하는 것이 좋습니다 (테이블이 MyISAM 스토리지 엔진을 사용한다면).

CREATE FULLTEXT INDEX jobsearch_idx ON my_jobs_table (job_title, job_description, location); 

그런 다음 MATCH() 연산자를 사용하여 검색 할 수 있습니다

SELECT * FROM my_jobs_table 
WHERE MATCH(job_title, job_description, location) AGAINST(?); 

대체 내가 "?"위가 사용자가 지정한 키워드. BTW, 나는 합리적인 디자인은 제목이나 설명에 발생하는 경우 위치 키워드를 찾을 수 있도록하는 것이라고 가정합니다. 따라서 응용 프로그램에서 키워드를 위치 선택 (공백으로 구분)하여 연결하고 쿼리 매개 변수에 사용하십시오.

의도적으로 일치하는 카테고리 이름을 원한다고 가정하기 때문에이 예에서 의도적으로 category을 남겼습니다. 따라서이 같은 AND 연산자를 추가

SELECT * FROM my_jobs_table 
WHERE category = ? 
    AND MATCH(job_title, job_description, location) AGAINST(?); 

대체 사용자 선택 (카테고리와 키워드를) 위의 두 "?"자리 표시합니다. 변수 보간법이 아닌 쿼리 매개 변수를 사용하십시오.

물론 MySQL 전체 텍스트 색인을위한 다른 많은 옵션이 있습니다. 예를 들어 검색 수정 자 "IN BOOLEAN MODE"을 사용할 수 있습니다. 여기서 완전히 설명하지는 않겠습니다. 자세한 내용은 설명서 섹션을 읽어야합니다.

MySQL 5.1 Reference Manual: Full-Text Search Functions.

사용자가 양식 필드를 비워 두는 경우의 처리 방법은 데이터베이스 검색과는 별도로 다른 문제입니다. Javascript 나 응용 프로그램 코드에서이 문제를 해결해야합니다. 사용자가 값을 제공하지 않으면 기본값을 설정하거나 양식으로 반환하고 필수 필드에 값을 제공하지 않고 계속할 수 없다는 것을 알려 주어야합니다.

+0

감사합니다 빌과 다른 사람들, 나는이 방법을 시도하고 결과를 다시 게시 할 것입니다. –

1

LIKE를 사용하는 경우 문자열의 양쪽 끝에 %를 배치해야합니다. 하지만,

SELECT * FROM my_jobs_table 
WHERE category = 'User specified job type' 
OR job_title LIKE '%keyword%' 
OR job_description LIKE '%keyword%' 
OR location LIKE '%location%' 

당신은 정말 매개 변수화 된 쿼리를 사용한다 : % 와일드 카드 문자입니다. (몇 가지 예는 here을 참조하십시오.) 적어도 사용자가 제공 한 쿼리 부분을 벗어나고 있는지 확인하십시오.

0

이 상황에서 나는 JOIN 또는 WHERE가없는 기본 쿼리를 설정합니다. 그런 다음 요청 값을 반복하고 쿼리를 작성합니다. 이 같은 것 :

$q="SELECT * FROM my_jobs_table"; 

foreach($post as $key=>$value) { //assuming you cleaned & validated the $_POST into $post 
    switch($key) 
    case 'category': 
     $wheres[]="$key ='$value'"; 
     break; 
    case 'job_title': 
    case 'job_description': 
    case 'location': 
     $wheres[]="$key LIKE '%{$value}%'"; 
     break; 
    } 
} 
$where='WHERE ' . implode(' AND ', $wheres); //put on a condition to check for empty($wheres) 
$q .= $where;