2014-04-29 6 views
3

이것은 간단하지만 동시에는 아닙니다.그렇지 않은 경우 룩 쿼리를 단축하려고 시도합니다.

사용자가 이름을 입력하는 기본 검색 상자가 있습니다. first_namelast_name으로 만 구성된 이름입니다. 표는 first_name, last_name, display_namefirs_namelast_name 분명히 어떤 성과 이름있는 열을 가지고 있으며, display_namefirst_namelast_name의 연결 또는 Bill Smith의 표시 이름이있을 수 있습니다 선호하는 이름 때문에 William Smith 중 하나입니다.

wackyness :

첫 번째 이름과 마지막 이름을 모두 두 번 이름이 될 수 있습니다. 그함으로써 나는 우리가 최상의 시나리오는, 이름이 Anna Smith을 것

First Name: Anna Maria Last Name: Smith 
First Name: Anna   Last Name: Bo Johnson 
First Name: Anna Maria Last Name: Bo Johnson. 

같은 이름을 가질 수있는 의미하지만이 작업을 수행해야 할 정도로 최악의 시나리오 Anna Maria Bo Johnson있어.

Anna Maria Bo Johnson에 대한 사용자 검색이 나는 첫 번째 또는 마지막 이름이며, 슬프게도 이중 첫번째 이중 성이 Anna Bo Maria Johnson 같은 84 개 조합을 가진 4 "단어"의 어느 인식하지의 쿼리를 실행해야

, 또는 Bo Maria Johnson Anna 등 ...

지금 내 문제는, 내가 내 MySQL의 쿼리가 긴 같은 84 개 라인이 될 싶지 않다 :

SELECT * FROM tablename a 
WHERE 
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[1]') OR  
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[2]') OR   
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[1] $search_term[2]') OR 
    (a.first_name = '$search_term[0]' AND a.last_name = '$search_term[2] $search_term[1]') OR 
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[0]') OR 
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[1]') OR  
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[0] $search_term[2]') OR 
    (a.first_name = '$search_term[1]' AND a.last_name = '$search_term[2] $search_term[0]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[0]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[1]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[0] $search_term[1]') OR 
    (a.first_name = '$search_term[2]' AND a.last_name = '$search_term[1] $search_term[0]') OR 
    (a.first_name = '$search_term[0] $search_term[1]' AND a.last_name = '$search_term[2]') OR 
    (a.first_name = '$search_term[1] $search_term[0]' AND a.last_name = '$search_term[2]') OR 
    (a.first_name = '$search_term[0] $search_term[2]' AND a.last_name = '$search_term[1]') OR 
    (a.first_name = '$search_term[2] $search_term[0]' AND a.last_name = '$search_term[1]') OR 
    (a.first_name = '$search_term[1] $search_term[2]' AND a.last_name = '$search_term[0]') OR 
    (a.first_name = '$search_term[2] $search_term[1]' AND a.last_name = '$search_term[0]') OR 
    a.display_name = '$search_term[0] $search_term[1] $search_term[2]' OR 
    a.display_name = '$search_term[1] $search_term[2] $search_term[0]' OR 
    a.display_name = '$search_term[2] $search_term[1] $search_term[0]' 
ORDER BY last_name, first_name ASC 

이 그래서 좋은 빠르고 더 효율적 일 것입니다 무슨 (3 단어 이름 예) 이 쿼리를 작성하는 방법. 기본적으로 나는 각 단어를 임의의 단일 단어 또는 2 단어 조합의 모든 필드와 비교 (=)해야합니다.

미리 도움 주셔서 감사합니다.

+0

case $ iterial = $ search_term []은 explode()를 사용하여 "Anna Maria Bo Johnson"이라는 단어를 공백으로 나눠서 만든 배열입니다. – ipixel

+0

LIKE 연산자를 사용할 수 있습니다 (http://www.w3schools.com). /sql/sql_like.asp) 쿼리에 있지만 여러 결과를 얻을 것이다. 검색의 요점은 정확히 하나의 결과가 올 것입니까? –

+0

필자는 "정확한"검색 결과를 제외한 모든 것을 제공하는 AND 입력 필드 (NOT FROM FROM ...)와 함께 LIKE를 사용하는 별도의 쿼리를 사용합니다. – ipixel

답변

1

사용 IN 문 :

SELECT * 
FROM tablename a 
WHERE concat_ws(' ',a.first_name,a.last_name) IN ('John Smith','Samantha Rose') 
+0

그럼 모든 변형을 IN() 부분에 나열합니다. – ipixel

+0

예, concat_ws 문은 IN 문에 설명 된 조건과 비교하기 위해 DB에서 firstname과 lastname으로 문자열을 만들 수 있습니다. – sdespont

+0

이것은 많은 의미를 갖습니다. 나는 희망을 갖고 약간의 확실한 결과를 가지고 이것을 줄 것이다. – ipixel

0

난 당신이 일치하려는 작업에 조금 혼란 스러워요. 당신이 가진 쿼리를 보면 마리아 보 존슨이나 심지어 보 안나와 일치하는 것처럼 보입니다. 그게 의도 된거야? 그래서, 당신은

SELECT * FROM tablename a WHERE 
(a.first_name = '$search_term[0]' OR a.first_name = '$search_term[1]' OR 
a.first_name = '$search_term[2]' OR a.first_name = '$search_term[3]') 
AND 
(a.last_name = '$search_term[0]' OR a.last_name = '$search_term[1]' OR 
a.last_name = '$search_term[2]' OR a.last_name = '$search_term[3]') 

을 할 수 있다면

은 (아마도 체크하는 FIRST_NAME! = LAST_NAME을 추가 ...)

+0

예, 변형이 너무 많기 때문입니다. 이 쿼리는 Anna Maria가 이름이고 성 또는 이름의 일부로 취급해야한다고 가정 할 수 없습니다. – ipixel

0

입력이 단지 이름의 일부가 될 수있는 경우 LIKE 망가 폭발하지만 concatenise MySQL의에서

where concat(a.first_name, ' ', a.last_name) = '$search_terms' or a.display_name = '$search_terms' 

및 사용 : 당신은 사람들이 때로부터 시작 두려워하는 경우

where concat(a.first_name, ' ', a.last_name) LIKE '%$search_terms%' or a.display_name LIKE '%$search_terms%' 

편집 성, 때로는 이름이있는 경우 1 추가 조건 추가 :

where concat(a.first_name, ' ', a.last_name) = '$search_terms' or concat(a.last_name, ' ', a.first_name) = '$search_terms' or a.display_name = '$search_terms' 
+0

하지만이 모든 변형을 시도 할 예정입니까? 안나 마리아 보 존슨, 안나 보 마리아 존슨, 안나 존슨 보 마리아, 마리아 안나 존슨 보, 는 등 ... – ipixel

+0

왜 사람들은 잘못된 순서로 이름을 검색까요? –

+0

저는 유럽인입니다. 우리는 사람들을 성, 이름으로 언급하는 경향이 있습니다. 그래서 habbit의 힘이 Bo Johnson Anna와 같은 검색을 유발할 수 있으므로 예방 조치를 취하고 있습니다. – ipixel

관련 문제