2010-05-31 4 views
1

테이블의 스키마는 매우 간단합니다. 나는 주소와 전화 번호 같은 고객의 정보를 저장하는 자식 테이블을 가지고있다. 열은 user_id, fieldname, fieldvalue 및 fieldname입니다. 각 행에는 전화 번호, 주소 또는 이메일과 같은 항목이 하나씩 있습니다. 이것은 각 고객에 대해 각 유형의 정보를 무제한으로 허용하는 것입니다. 휴대폰에mysql에서 전체 텍스트 인덱스를 검색하는 쿼리를 작성하려고합니다.

사람들은 그들이 우리의 콜 센터에 전화로 신속하게 이러한 고객을 찾아 볼 필요가있다. LIKE %를 사용하여 실험 해본 결과 지금 FULLTEXT 인덱스로 작업하고 있습니다. 내 쿼리는 작동하지만 사람들이 805와 같은 전화 지역 코드를 검색하면 많은 사람들이 생길 것이기 때문에 Bill을 더 유용하게 만들고 싶습니다. 그런 다음 Bill을 추가하여 '805 Bill'이라는 이름을 추가합니다. 그것은 805 OR 빌을 가진 모든 고객을 보여줄 것입니다. 각 고객의 여러 행에 걸쳐 검색을 수행하고 싶습니다.

현재 나는 user_ids를 잡아 아래의 쿼리를 사용하고 나중에 나는 그들의 완전한 기록을 구축하기 위해 각 사용자에 대한 모든 세부 사항을 가져 오는 또 다른 질문을한다.

SELECT DISTINCT `user_id` FROM `user_details` WHERE MATCH (`fieldvalue`) AGAINST ('805 Bill') 

는 다시, 나는 단일 사용자에 속하는 행 그룹에 대한 위의 쿼리를 수행하고 싶지만, 그 사용자는 검색 키워드와 일치해야합니다. 어떻게해야합니까?

답변

0

BOOLEAN MODE 검색어를 사용해 보셨습니까?

SELECT `user_id` FROM `user_details` 
WHERE MATCH (`fieldvalue`) AGAINST ('+805 +Bill' IN BOOLEAN MODE) 

사용자가 입력 한 검색어를 조작해야한다는 뜻입니다. 축 어적으로 쿼리에 전달할 수는 없습니다. + 문자를 추가해야합니다.


Re the comment : 모든 SQL 술어는 한 번에 한 행의 컨텍스트에서만 평가됩니다. 그것은이 쿼리에서 어떤 조합이 없기 때문에 내가 DISTINCT를 제거 만 성능이 저하 될 수 있습니다

SELECT `user_id` FROM `user_details` u1 JOIN `user_details` u2 USING (`user_id`) 
WHERE MATCH (u1.`fieldvalue`) AGAINST ('805 Bill' IN BOOLEAN MODE) 
    AND MATCH (u2.`fieldvalue`) AGAINST ('805 Bill' IN BOOLEAN MODE) 

PS를 : 행을 비교하는 방법은 사용하는 것 자체를 조인.

+0

나는 그것을 시도했지만 두 키워드가 같은 행에있을 경우 user_id 만 반환합니다. 여러 행에서 작동하지 않는 것 같습니다. – EricLeslie

+0

좋아, 이건 내 바른 길이다. 따라서 각 키워드에 대해 추가 조인을해야합니다. – EricLeslie

0

생각 : 두 FULLTEXT 인덱스를 가지고 할 수있는 WHERE MATCH (ㅋ) 및 MATCH (ㅋ ㅋ)?

물론 지역 코드는 별도의 필드에 저장하십시오. 당신이 결과를 얻기 위해 두 개의 질의를 할 필요가 없습니다

는 MySQL은 또한, 부속 선택을 지원합니다.

관련 문제