2012-10-12 4 views
7

나는 현재 다음과 같습니다 검색이 :mysql에서 JOIN 검색으로 LIKE를 개선하려면 어떻게해야합니까?

SELECT s.ID 
    FROM Shoe s 
     INNER JOIN Account a 
      ON s.UserID = a.ID 
     WHERE s.Publish='1' AND 
      (s.Brand LIKE '%$Search%' 
      OR s.Name LIKE '%$Search%' 
      OR s.PrimaryColor LIKE '%$Search%' 
      OR a.User LIKE '%$Search%') 
     ORDER BY s.ID DESC 
LIMIT $offset, $rowsPerPage" 

이 내가 같은 "블루"또는 "나이키"로 검색을 수행 할 때 잘 작동하지만 나는 그런 "블루 나이키"아무것도로 검색을 할 경우 보고. FULLTEXT을 사용해야합니까? 어떻게 개선 할 수 있습니까? 검색 변수와 관련된 모든 열을 검색 할 수 있기를 원합니다.

+1

예, MySQL의 전체 텍스트 검색 기능 또는 외부 검색 색인을 사용해야합니다. –

+4

LIKE 왼쪽에 와일드 카드를 사용하면 MySQL이 인덱스를 사용하지 못하게됩니다. 필요에 따라 solr과 같은 것을 볼 수도 있습니다. –

+0

@SeanBright Fulltext와 함께 Match Against를 시도했지만 결과가 0 점입니다. 나는 이것을 더 자세히 조사하고 이것을 보았습니다 - http://stackoverflow.com/questions/5925369/mysql-join-and-match-against-search-fail "stop"단어 때문에 작동하지 않는 것 같습니다. 나는 잃어버린 경우에 mysql에 너무 전진하지 않는다 그래서 저를 용서하십시오. – SReca

답변

1

를 장난과 다른 것들을 테스트 후, 나는이 함께했다 :

"FROM Shoe AS s 
    LEFT JOIN Accounts AS a ON s.UserID = a.ID 
    WHERE (MATCH (s.Brand, s.Name, s.PrimaryColor AGAINST('$Search' IN BOOLEAN MODE) 
     OR MATCH (a.User) AGAINST('$Search' IN BOOLEAN MODE)) 
      AND s.Publish='1' 
    ORDER BY s.ID DESC" 

이를 위에서 언급 한 문제를 해결 한 것처럼 보입니다. 이제는 "Blue Nike"와 같은 검색을 수행 할 수 있으며 파란색과 관련된 모든 항목을 &에 게재 할 수 있습니다. 이 방법이 가장 효율적인 방법인지는 모르지만 작동합니다.

0

LIKE 대신 SOUNDEX 또는 둘 다 사용 해보십시오.

둘째, 당신은 예를 들어, 대문자를 유지하기 위해 쿼리를 최적화 할 수 있습니다 : 그래서

(lower(s.Brand) LIKE '%" . strtolower($Search) . "%' 
OR lower(s.Name) LIKE '%" . strtolower($Search) . "%' 
OR lower(s.PrimaryColor) LIKE '%" . strtolower($Search) . "%' 
OR lower(a.User) LIKE '%" . strtolower($Search) . "%') 
+0

그래서 맨 위에 'SELECT s.ID, SOUNDEX (s.Brand), SOUNDEX (s.Name), SOUNDEX (s.PrimaryColor), SOUNDEX (a.User) FROM Shoe s ...와 같은 것이되어야합니다. '? – SReca

+0

다음과 같은 것 : SELECT * FROM shoes AS s WHERE (s.Name SOUNDS LIKE 'Nike'또는 s.Name LIKE 'Nike %'); –

+0

귀하의 제안을 이행했지만 결과를 개선하지 않았습니다. 내가 결과를 얻은 브랜드를 검색하면 색을 검색하면 아무 것도 표시되지 않습니다. – SReca

관련 문제