2012-10-12 34 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進行比較,並得到零結果。我進一步搜索這個,並遇到這個 - http://stackoverflow.com/questions/5925369/mysql-join-and-match-against-search-fail似乎不會因爲「停止」的話而工作。如果我迷路了,我不會太在意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" 

這似乎解決了我上面提到的問題,現在我可以做一個搜索,如「藍色耐克」,所有與藍色&相關的項目都會顯示出來。不知道這是否是最有效的方法,但它確實有效。

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鞋子s ... '? – SReca

+0

就像這樣:SELECT * FROM shoe AS s WHERE(s.Name SOUNDS LIKE'Nike'or s.Name LIKE'Nike%'); –

+0

我實施了你的建議,但我沒有改善結果。如果我搜索一個品牌,我得到的結果,如果我搜索一個顏色什麼都沒有顯示。 – SReca

相關問題