2013-06-11 53 views
2

我是新來的mysql數據庫。我有一個搜索欄,允許用戶鍵入關鍵字和搜索。查詢當任何單詞包含

以下是我的查詢示例。如果我輸入usaapple,但是如果我一起輸入usa apple,它可以正常工作。結果是0.我想要的是,當用戶鍵入'美國蘋果',從美國返回蘋果行(第一行)。

$search="usa apple"; 

fruit country 
apple usa 
apple aus 
banana usa 
orange usa 


SELECT * FROM market WHERE fruit LIKE '%$search%' || country LIKE '%$search%' 
+0

如果用戶輸入「I love usa new york banana」 – user2178521

+0

如果我們將每個作品分解成數組,那麼查詢將返回I,愛,美國,新的,紐約,香蕉,這將搜索包括我,愛的所有內容。 – user2178521

+0

請看看編輯過的帖子。 – Kevin

回答

3

那麼,首先你需要將輸入搜索查詢分隔成單獨的關鍵字。在PHP中,你可以做到這一點,如下所示:

$keywords = explode(' ', $searchQuery); 

然後,使用AND關鍵字查詢檢索所需的行。

$query = "SELECT * FROM market WHERE fruit LIKE '%$keywords[0]%' AND country LIKE '%$keywords[1]%'"; 

由於有時關鍵詞的順序可能會相反,你可以使用一個OR操作了。

$query = "SELECT * FROM market WHERE (fruit LIKE '%$keywords[0]%' AND country LIKE '%$keywords[1]%') OR (fruit LIKE '%$keywords[1]%' AND country LIKE '%$keywords[0]%')"; 

如果您認爲用戶可能會使用其他不同的分隔符比space你可以使用正則表達式來確定是不是字母數字字符的任何存在。然後,使用該字符作爲分隔符並標識各個關鍵字。

Determine if a character is alphabetic

[編輯]:

另一個簡單的事情是,使用MySQL的OR語句,並檢查是否有任何一個條件匹配。不需要爆炸查詢。

$query = "SELECT * FROM market WHERE (fruit LIKE '%$query%' AND country LIKE '%$query%') OR (fruit LIKE '%$query%') OR (country LIKE '%$query%') "; 

該查詢將首先檢查兩個關鍵字是否存在,然後檢查各個關鍵字是否存在並相應返回。

+0

如果用戶鍵入美國蘋果,比數組將放置在錯誤列 – user2178521

+0

如果用戶輸入美國,蘋果什麼。我在考慮使用循環,這是好的,因爲我們不知道用戶輸入多少單詞 – user2178521

+1

在這種情況下,您需要使用php執行附加檢查以確定分隔符和進程的數量的關鍵字。通常,像這樣的搜索模塊將需要相對較多的檢查和條件。 – Kevin