2012-10-12 23 views
7

Tôi hiện đang có một tìm kiếm mà trông như thế này:Làm cách nào để cải thiện LIKE của tôi với tìm kiếm JOIN trong mysql?

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" 

này hoạt động tốt khi tôi thực hiện tìm kiếm như "Blue" hay "Nikes", nhưng nếu tôi làm một tìm kiếm như "Blue Nikes" không có gì trả về. Tôi có nên sử dụng FULLTEXT không? Làm thế nào tôi có thể cải thiện điều này? Tôi muốn có thể tìm kiếm tất cả các cột có thể liên quan đến biến tìm kiếm.

+1

Có, bạn nên sử dụng khả năng tìm kiếm văn bản đầy đủ của MySQL hoặc chỉ mục tìm kiếm bên ngoài. –

+4

Sử dụng ký tự đại diện ở bên trái của LIKE sẽ ngăn không cho MySQL sử dụng chỉ mục. Tùy thuộc vào nhu cầu của bạn, bạn cũng có thể nhìn vào thứ gì đó như solr. –

+0

@SeanBright Tôi đã thử sử dụng Match Against with Fulltext và nhận được kết quả bằng không. Tôi tiếp tục tìm kiếm này và đi qua này - http://stackoverflow.com/questions/5925369/mysql-join-and-match-against-search-fail dường như nó sẽ không hoạt động vì "dừng" từ. Tôi không quá tiến bộ trên mysql vì vậy tha thứ cho tôi nếu tôi bị mất. – SReca

Trả lời

1

Vì vậy, sau khi rối tung xung quanh và thử nghiệm những điều khác nhau, tôi đã đưa ra với điều này:

"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" 

này dường như khắc phục sự cố của tôi mà tôi đã đề cập ở trên, giờ đây tôi có thể thực hiện tìm kiếm như "Blue Nike" và tất cả các mục liên quan đến màu xanh & nike sẽ hiển thị. Không chắc chắn nếu đây là cách hiệu quả nhất để đi về nó, nhưng nó hoạt động.

0

Thay vì LIKE hãy thử sử dụng SOUNDEX hoặc cả hai.

Thứ hai, bạn có thể muốn để tối ưu hóa truy vấn để duy trì vốn, ví dụ:

(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

Vì vậy, ở đầu nó nên là một cái gì đó như thế này 'SELECT s.ID, SOUNDEX (s.Brand), SOUNDEX (s.Name), SOUNDEX (s.PrimaryColor), SOUNDEX (a.User) TỪ ... '? – SReca

+0

Một cái gì đó như thế này: SELECT * FROM giày AS s WHERE (s.Name SOUNDS LIKE 'Nike' HOẶC s.Name LIKE 'Nike%'); –

+0

Tôi đã thực hiện đề xuất của bạn nhưng tôi không cải thiện kết quả. Nếu tôi tìm kiếm một thương hiệu tôi nhận được kết quả, nếu tôi tìm kiếm một màu sắc không có gì hiển thị. – SReca

Các vấn đề liên quan